这个赋值运算符后面的 & 是啥意思?

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;

【讨论】:

以上是关于这个赋值运算符后面的 & 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

运算符或赋值运算符的后面是啥? [复制]

c语言中num是啥意思

verilog中的赋值运算符<=具体是啥意思

java中这个符号“=”是啥意思?

在oracle select 的条件后面跟上into是啥意思

c语言中规定 赋值运算符的左边必须是啥?