【发布时间】:2013-06-12 09:48:24
【问题描述】:
在使用 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();
}
Clang 编译它并输出 "const rvalue",而 GCC 认为这是一个模棱两可的调用,两个 const 限定函数都是最可行的候选者。如果我提供所有 4 个重载,那么两个编译器都会输出 "non-const rvalue"。
我想知道哪个编译器--如果有的话-- 正在做正确的事情,还有哪些相关的标准在起作用。
注意: 这实际上很重要的原因是实际代码将两个 const 限定函数声明为 constexpr。当然,std::cout 没有输出,并且使用static_cast 代替std::move,因此它们是有效的constexpr 定义。由于在 C++11 中constexpr 仍然暗示const,因此无法提供示例代码中注释掉的重载,因为它会重新定义 const 限定的右值重载。
【问题讨论】:
标签: c++ c++11 overloading language-lawyer ref-qualifier