这个赋值运算符后面的 & 是啥意思?
Posted
技术标签:
【中文标题】这个赋值运算符后面的 & 是啥意思?【英文标题】:What does an ampersand after this assignment operator mean?这个赋值运算符后面的 & 是什么意思? 【发布时间】:2012-08-31 15:16:00 【问题描述】:我正在阅读关于“五规则”的 nice answer 并注意到一些我不记得以前见过的东西:
class C
...
C& operator=(const C&) & = default;
C& operator=(C&&) & = default;
...
;
对于复制赋值运算符和移动赋值运算符,= default
前面的 &
字符的用途是什么?有人有这方面的参考吗?
【问题讨论】:
GCC 4.7.1 上的编译器错误。我从来没有听说过在那里放一个&符号。 阅读该答案的最后一条评论。 @JoachimPileborg 确实,但我不知道该怎么做,所以我更愿意问。 为了完整起见,请查看What is "rvalue reference for *this"?。*this
的右值引用从 gcc 4.8.1 开始实现。
【参考方案1】:
这是允许 C++11 非静态成员函数区分它们是在左值还是右值上调用的功能的一部分。
在上述情况下,这里默认的复制赋值运算符只能在左值上调用。这使用了成熟的左值和右值引用绑定规则;这只是为this
建立它们。
在上述情况下,只有当被复制到的对象可以绑定到非 const 左值引用时,才会默认复制赋值运算符。所以这很好:
C c;
c = C;
这不是:
C = c;
这里的临时不能绑定到左值引用,因此不能调用复制赋值运算符。并且由于此声明将阻止创建通常的复制赋值运算符,因此此语法有效地防止复制分配(或移动分配)到临时对象。为了恢复它,您需要添加一个&&
版本:
C& operator=(const C&) && = default;
C& operator=(C&&) && = default;
【讨论】:
有趣...这是在任何编译器中实现的吗? @MihaiTodor:它不在 GCC 中 apparently,但 Clang 有 had it since 2.9。它通常被称为“*this
的右值引用”
在整个帖子中,您指的是复制构造函数,但问题是关于复制分配。【参考方案2】:
这意味着该函数只能在左值上调用。所以这会失败,因为赋值运算符函数是在右值对象表达式上调用的:
C() = x;
【讨论】:
以上是关于这个赋值运算符后面的 & 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章