[英]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.