提问者:小点点

这个赋值运算符后面的一个“与”是什么意思?


我正在阅读这个关于“五法则”的好答案,我注意到了一些我以前没有见过的东西:

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

对于复制赋值运算符和移动赋值运算符,放在=default前面的&字符的用途是什么? 有人对此有参考资料吗?


共2个答案

匿名用户

它是允许C++11非静态成员函数区分它们是在lvalues上调用还是在rvalues上调用的特性的一部分。

在上面的情况下,这里默认的复制赋值运算符只能在lvalues上调用。 这将使用已建立的lvalue和rvalue引用绑定规则; 这只是为this建立它们。

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

C c{};
c = C{};

这不是:

C{} = c;

此处的临时值无法绑定到lvalue引用,因此无法调用复制赋值运算符。 并且由于该声明将阻止创建通常的复制赋值运算符,因此该语法有效地阻止了对临时对象的复制赋值(或移动赋值)。 为了还原,您需要添加&&版本:

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

匿名用户

这意味着该函数只能在lvalues上调用。 因此这将失败,因为赋值运算符函数是在rvalue对象表达式上调用的:

C() = x;