【发布时间】:2013-06-04 10:21:09
【问题描述】:
以下代码在 gcc 4.8.1 上编译没有问题:
#include <utility>
struct foo
{
};
int main()
{
foo bar;
foo() = bar;
foo() = std::move( bar );
}
似乎为foo 隐式生成的赋值运算符不是& ref-qualified,因此可以在右值上调用。根据标准,这是否正确?如果是这样,不要求隐式生成的赋值运算符是& ref-qualified的原因是什么?
为什么标准不要求生成以下内容?
struct foo
{
foo & operator=( foo const & ) &;
foo & operator=( foo && ) &;
};
【问题讨论】:
-
请记住,在 C++11 之前存在隐式复制赋值运算符,因此在非静态成员函数存在引用限定符之前。这和标准委员会在使用更新的编译器编译以前的 C++ 代码时的理念。
-
@Luc 出于某种原因,直到我发布问题后,我才想到向后兼容。我忘记了典型的成本/收益分析在考虑更改标准时并不适用。
标签: c++ c++11 assignment-operator rvalue-reference rvalue