这个赋值运算符后的&符是什么意思?

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)