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

时间:2012-09-06 18:29:03

标签: c++ c++11 assignment-operator default-implementation

我正在阅读关于“五条规则”的nice answer,我注意到了一些我以前没有记得的事情:

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

&字符放置在= default前面,用于复制赋值运算符和移动赋值运算符的目的是什么?有没有人有这方面的参考?

2 个答案:

答案 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;