隐式生成的赋值运算符应该是&ref-qualified吗?

And*_*ard 10 c++ rvalue rvalue-reference assignment-operator c++11

以下代码在gcc 4.8.1上编译没有问题:

#include <utility>

struct foo
{
};

int main()
{
    foo bar;

    foo() = bar;
    foo() = std::move( bar );
}
Run Code Online (Sandbox Code Playgroud)

似乎隐式生成的赋值运算符foo不是&ref-qualified,因此可以在rvalues上调用.根据标准,这是正确的吗?如果是这样,有什么理由要求隐式生成的赋值运算符被重新&限定?

为什么标准不要求生成以下内容?

struct foo
{
  foo & operator=( foo const & ) &;

  foo & operator=( foo && ) &;
};
Run Code Online (Sandbox Code Playgroud)

Cha*_*via 8

嗯,有一些合法的用例分配给右值.引用标准库中赋值运算符的Ref-qualifiers:

只有少数非常具体的类型支持分配给右值是有意义的.特别是,用作代理的类型,例如vector <bool> :: reference,以及其赋值运算符是const限定的类型(例如,slice_array).

C++标准委员会显然认为默认赋值不应该有隐式ref限定符 - 而应该明确声明它.实际上,如果突然所有隐式声明的赋值运算符都不能与rvalues一起工作,可能会有现有代码停止工作.

当然,设想一个我们希望隐式声明的赋值运算符与rvalues一起工作的例子有点难,但C++标准委员会可能不希望在保留向后兼容性时采取这种机会.像这样的代码:

int foo_counter = 0;

struct Foo
{
    Foo()
    {
        ++foo_counter;
    }

    ~Foo()
    {
        --foo_counter;
    }
};

int main()
{
    Foo() = Foo();
}
Run Code Online (Sandbox Code Playgroud)

......不再适用了.在一天结束时,标准委员会希望确保以前有效的C++(无论多么愚蠢或做作)继续在C++ 11中运行.