7

考虑这段代码:

#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());
}

如果我用 MSVC 2012 编译它,输出是:

f(int&&)
f(const int&&)

如果我用 GCC 4.7 编译,输出是:

f(int&&)
f(int&&)

哪个是对的?

(如果我删除 f 的第二个定义,程序将无法在 MSVC 2012 下编译,但在 GCC 4.7 下会编译。)

4

2 回答 2

9

海湾合作委员会是正确的。从 3.10 左值和右值 [basic.lval] 的第 4 段:

类纯右值可以有 cv 限定类型;非类纯右值总是有 cv 非限定类型。[...]

诸如此类的函数调用fun_ci()实际上是prvalue*,因此具有类型int,而不是const intint&&是比 更好的匹配const int&&,并且应该由重载决议选择。

*:习惯上说顶级 cv 限定符对于非类返回类型被忽略。

于 2012-08-28T14:01:22.673 回答
2

我倾向于说 gcc 似乎在做正确的事情,基于它发出的警告:

stieber@gatekeeper:~$ g++ -std=c++11 -Wignored-qualifiers Test.cpp
Test.cpp:20:18: warning: type qualifiers ignored on function return type [-Wignored-qualifiers]
于 2012-08-28T14:01:39.223 回答