我在阅读这篇有关“五项规则”的精彩回答时,注意到了一些我之前没有看到的内容:
class C {
...
C& operator=(const C&) & = default;
C& operator=(C&&) & = default;
...
};
在复制赋值运算符和移动赋值运算符的= default
前面放置&
字符的目的是什么?有没有任何相关资料可以参考?
我在阅读这篇有关“五项规则”的精彩回答时,注意到了一些我之前没有看到的内容:
class C {
...
C& operator=(const C&) & = default;
C& operator=(C&&) & = default;
...
};
在复制赋值运算符和移动赋值运算符的= default
前面放置&
字符的目的是什么?有没有任何相关资料可以参考?
这是一个特性的一部分,允许C++11非静态成员函数区分它们是在左值还是右值上被调用。
在上述情况中,默认情况下复制赋值运算符只能在左值上调用。这使用了已经很好地建立起来的左值和右值引用绑定规则;这只是为this
建立了它们。
在上述情况中,仅当要复制到的对象可以绑定到非常量左值引用时,才会默认复制赋值运算符。所以这是没有问题的:
C c{};
c = C{};
这不是:
C{} = c;
此处的临时对象无法绑定到左值引用,因此无法调用复制赋值运算符。由于此声明将防止创建通常的复制赋值运算符,所以此语法有效地防止了对临时对象进行复制赋值(或移动赋值)。为了恢复此功能,您需要添加一个 &&
版本:
C& operator=(const C&) && = default;
C& operator=(C&&) && = default;
这意味着该函数只能在左值上被调用。因此,由于赋值运算符函数在一个右值对象表达式上被调用,所以这将失败:
C() = x;
*this
的右值引用被实现。 - Alexander Oh