这个赋值运算符之后的和号是什么意思?

我正在阅读关于“五规则”的这个很好的答案 ,我注意到了一些我不记得以前看到的东西:

class C { ... C& operator=(const C&) & = default; C& operator=(C&&) & = default; ... }; 

“复制赋值”操作符和“移动赋值”操作符在“ = default前放置的&字符的用途是什么? 有没有人有这个参考?

它是允许C ++ 11非静态成员函数区分它们是在左值还是右值被调用的function的一部分。

在上述情况下,这里默认的复制赋值运算符只能在左值被调用。 这使用规则来确定左值和右值引用绑定; 这只是为此build立起来的。

在上述情况下,复制赋值操作符只有在被复制的对象可以绑定到非常量左值引用时才被默认。 所以这很好:

 C c{}; c = C{}; 

这不是:

 C{} = c; 

这里的暂时不能绑定到一个左值引用,因此复制赋值操作符不能被调用。 而且由于这个声明将阻止创build通常的复制赋值操作符,所以这个语法有效地防止了对临时对象的拷贝分配(或移动赋值)。 为了恢复,你需要添加一个&&版本:

 C& operator=(const C&) && = default; C& operator=(C&&) && = default; 

这意味着这个函数只能在左值被调用。 所以这将失败,因为在右值对象expression式上调用赋值运算符函数:

 C() = x;