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