一些背景:
前几天我遇到了一些事情,这让我开始思考嵌套函数调用中的重载解析。考虑以下代码:
#include
void printer(const int &a)
{
std::cout << a << "\n";
}
const int& func(const int &a)
{
std::cout << "const int& ";
return a;
}
int& func(int &a)
{
std::cout << "int& ";
return a;
}
int main()
{
int a = 42;
const int b = 21;
printer(func(a));
printer(func(b));
trả về 0;
}
这段代码打印
int& 42
const int& 21
所以,显然 func(a) 认为 a 是一个非常量 int。编译器还必须看到打印机函数需要一个 const int& 参数。并且存在一个返回 const int& 的 func(...)。我研究了 C++ 标准,它说 const refs 和 refs 被认为是不同的参数类型(这就是它为 func(a) 选择 int& 的原因)。
câu hỏi:
是否允许编译器在调用 func(a) 时使用 func(const int &) 版本而不是 func(int&)?
(如果它看到结果被传递给需要 const int& 参数的函数,也许有某种优化的可能性。)
重载解析不考虑返回类型。也就是说,它只会查看函数的参数和不同的重载,而不管返回值将如何使用。
为了更明确的测试,考虑将非常量重载更改为:
void func( int& ) {}
这将无法编译,即使存在允许代码编译的不同类似重载也是如此。
Tôi là một lập trình viên xuất sắc, rất giỏi!