Const rvalue编译器的区别

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下编译.)

Luc*_*ton 9

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限定符.