在使用ref-qualified函数重载时,我发现GCC(4.8.1)和Clang(2.9和trunk)返回的结果不同。请参考以下代码:
#include <iostream>
#include <utility>
struct foo
{
int& bar() &
{
std::cout << "non-const lvalue" << std::endl;
return _bar;
}
//~ int&& bar() &&
//~ {
//~ std::cout << "non-const rvalue" << std::endl;
//~ return std::move(_bar);
//~ }
int const& bar() const &
{
std::cout << "const lvalue" << std::endl;
return _bar;
}
int const&& bar() const &&
{
std::cout << "const rvalue" << std::endl;
return std::move(_bar);
}
int _bar;
};
int main(int argc, char** argv)
{
foo().bar();
}
< p > Clang 编译并输出"const rvalue"
,而GCC认为这是一个不明确的调用,两个 const 限定的函数都是最佳可行候选项。如果我提供所有4个重载,那么两个编译器都会输出"non-const rvalue"
。
我想知道哪个编译器——如果有的话——做得对,以及相关的标准条款是什么。
注意:之所以这很重要,是因为真正的代码将两个 const 限定的函数声明为constexpr
。当然,没有输出到std::cout
,并且使用static_cast
而不是std::move
,以使它们成为有效的constexpr
定义。由于在C++11中,constexpr
仍然意味着const
,因此不能提供示例代码中被注释掉的重载,因为它将重新定义 const 限定的 rvalue 重载。