我正在阅读关于“五条规则”的nice answer,我注意到了一些我以前没有记得的事情:
class C {
...
C& operator=(const C&) & = default;
C& operator=(C&&) & = default;
...
};
&
字符放置在= default
前面,用于复制赋值运算符和移动赋值运算符的目的是什么?有没有人有这方面的参考?
答案 0 :(得分:37)
这是允许C ++ 11非静态成员函数区分它们是在左值还是右值上调用的功能的一部分。
在上述情况下,此处默认的复制赋值运算符只能在左值上调用。这使用了很好建立的左值和右值引用绑定的规则;这只是为this
建立了它们。
在上述情况下,只有在被复制的对象可以绑定到非const左值引用时,才会默认复制赋值运算符。所以这很好:
C c{};
c = C{};
这不是:
C{} = c;
此处的临时值无法绑定到左值引用,因此无法调用复制赋值运算符。由于此声明将阻止创建通常的复制赋值运算符,因此该语法有效地防止了复制赋值(或移动赋值)到临时值。要恢复该功能,您需要添加&&
版本:
C& operator=(const C&) && = default;
C& operator=(C&&) && = default;
答案 1 :(得分:13)
这意味着该函数只能在左值上调用。因此,这将失败,因为在rvalue对象表达式上调用赋值运算符函数:
C() = x;