C++ 在重载解析期间,是否允许编译器选择const ref over ref?
一些背景: 前几天我遇到了一些事情,让我想到了嵌套函数调用中的重载解析。考虑下面的代码:C++ 在重载解析期间,是否允许编译器选择const ref over ref?,c++,optimization,constants,overloading,C++,Optimization,Constants,Overloading,一些背景: 前几天我遇到了一些事情,让我想到了嵌套函数调用中的重载解析。考虑下面的代码: #include <iostream> void printer(const int &a) { std::cout << a << "\n"; } const int& func(const int &a) { std::cout << "const int& "; return a; } int&
#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;
}
显然,func(a)看到a是一个非常量int。编译器还必须看到打印机函数需要一个常量int&参数。还有一个func(…)返回常量int&。我研究了C++标准,它指出const REFS和REFs被认为是不同的参数类型(这就是为什么它选择int和FUNC(a))。
对该问题:
在调用func(a)时,是否允许编译器使用func(const int&)版本而不是func(int&)
(如果看到结果传递给一个需要cont int和参数的函数,可能存在某种优化可能性)
过载解析不考虑返回类型。也就是说,它将只查看函数的参数和不同的重载,而不考虑如何使用返回值对于更明确的测试,考虑将非const重载更改为:
void func( int& ) {}
编译失败,即使有不同的类似超载,允许代码编译。
过载解决方案不考虑返回类型。也就是说,它将只查看函数的参数和不同的重载,而不考虑如何使用返回值
对于更明确的测试,考虑将非const重载更改为:
void func( int& ) {}
它将无法编译,即使存在允许代码编译的其他类似重载。我很快注意到并删除了我的注释。你的回答很正确。我很快注意到了,并删除了我的评论。你的回答恰到好处。