一些背景知识:
前几天我遇到了一些让我想到嵌套函数调用中的重载解析的东西。请考虑以下代码:
#include <iostream>
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));
return 0;
}
此代码打印
int& 42
const int& 21
所以,显然func(a)看到a是非const int。编译器还必须看到打印机函数需要const int&amp;论点。并且存在一个返回const int&amp;的func(...)。我查看了C ++标准,它说const refs和refs被认为是不同的参数类型(这就是为什么它为func(a)选择int&amp;)。
问题:
在调用func(a)时,是否允许编译器使用func(const int&amp;)版本而不是func(int&amp;)?
(如果它看到结果传递给想要const int&amp;参数的函数,则可能存在某种优化可能性。)
答案 0 :(得分:5)
重载分辨率不考虑返回类型。也就是说,它只会查看函数的参数和不同的重载,而忽略了返回值的使用方式。
对于更明确的测试,请考虑将非常量重载更改为:
void func( int& ) {}
,即使存在允许代码编译的类似的重载,也无法编译。