繁体   English   中英

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

[英]What does an ampersand after this assignment operator mean?

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

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

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

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

在上述情况下,此处默认的复制赋值运算符只能在左值上调用。 这使用了完善的左值和右值引用绑定规则; 这只是他们建立了this

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

C c{};
c = C{};

这不是:

C{} = c;

这里的临时变量不能绑定到左值引用,因此不能调用复制赋值运算符。 并且由于此声明将阻止创建通常的复制赋值运算符,因此此语法有效地阻止了对 temporaries 的复制赋值(或移动赋值)。 为了恢复它,您需要添加一个&&版本:

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

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

C() = x;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM