在使用 ref 限定函数重载时,我从GCC (4.8.1)和Clang (2.9 and 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();
}
Clang编译它并输出"const rvalue"
,而GCC认为这是一个模棱两可的调用,两个 const 限定函数都是最可行的候选者。如果我提供所有 4 个重载,那么两个编译器都会输出"non-const rvalue"
.
我想知道哪个编译器——如果有的话——正在做正确的事情,以及相关的标准部分是什么。
注意:这实际上很重要的原因是实际代码将两个 const 限定函数声明为constexpr
. 当然,没有输出到std::cout
并且static_cast
被用来代替std::move
,所以它们是有效的constexpr
定义。并且由于在C++11 constexpr
中仍然暗示const
,因此无法提供示例代码中注释掉的重载,因为它会重新定义 const 限定的右值重载。