oz1*_*1cz 7 c++ rvalue-reference c++11
考虑以下代码:
#include <iostream>
void f(int&& i)
{
std::cout << "f(int&&)\n";
}
void f(const int&& i)
{
std::cout << "f(const int&&)\n";
}
int fun_i()
{
return 0;
}
const int fun_ci()
{
return 0;
}
int main()
{
f(fun_i());
f(fun_ci());
}
Run Code Online (Sandbox Code Playgroud)
如果我用MSVC 2012编译它,输出是:
f(int&&)
f(const int&&)
Run Code Online (Sandbox Code Playgroud)
如果我用GCC 4.7编译,输出是:
f(int&&)
f(int&&)
Run Code Online (Sandbox Code Playgroud)
哪个是对的?
(如果我删除f的第二个定义,程序将无法在MSVC 2012下编译,但它确实在GCC 4.7下编译.)
GCC是正确的.从3.10 Lvalues和rvalues [basic.lval]的第4段开始:
类prvalues可以具有cv-quali fi ed类型; 非类prvalues总是有cv-unquali fi ed类型.[...]
函数调用,例如fun_ci()实际上是prvalue*,因此具有类型int,而不是const int.int&&是一个更好的匹配const int&&,应该通过重载决议选择.
*:通常说非顶级返回类型会忽略顶级cv限定符.