c++ - 隐式生成的赋值运算符应该是 & ref 限定的吗?

标签 c++ c++11 assignment-operator rvalue-reference rvalue

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

#include <utility>

struct foo
{
};

int main()
{
    foo bar;

    foo() = bar;
    foo() = std::move( bar );
}

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

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

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

  foo & operator=( foo && ) &;
};

最佳答案

好吧,有一些合法的用例可以分配给右值。引用自Ref-qualifiers for assignment operators in the Standard Library:

There are only a few very specific types for which it makes sense to support assigning to an rvalue. In particular, types that serve as a proxy, e.g., vector<bool>::reference, and types whose assignment operators are const-qualified (e.g., slice_array).

C++ 标准委员会显然认为默认赋值不应具有隐式 ref 限定符 - 而应该显式声明。事实上,如果突然间所有隐式声明的赋值运算符都不能使用右值,那么现有代码可能会停止工作。

诚然,设计一个我们希望隐式声明的赋值运算符与右值一起使用的示例有点困难,但 C++ 标准委员会在保持向后兼容性方面可能不想冒这种风险。代码如下:

int foo_counter = 0;

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

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

int main()
{
    Foo() = Foo();
}

...不会再工作了。归根结底,标准委员会希望确保以前有效的 C++(无论多么愚蠢或做作)继续在 C++11 中工作。

关于c++ - 隐式生成的赋值运算符应该是 & ref 限定的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16995463/

相关文章:

c++ - 为什么不能用常量表达式声明数组?

c++11 - 去原子和内存顺序

c++ - 隐式复制构造函数/赋值运算符的行为

c++ - 了解扫描线最近对的具体实现

c++ - 使用 MPI_Bcast 发送具有动态大小的动态数组

c++ - 运算符重载并出现友元函数错误

c++ - 赋值运算符的 boolean 和字符串重载 (C++)

c++ - 引用返回和右值

c++ - 这是从析构函数中抛出异常的安全方法吗?

c++ - c++ - 如何将同一类的一个对象分配给同一类的另一个对象?