【问题标题】: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 开始实现。

标签: c++ c++11 assignment-operator default-implementation


【解决方案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;

【讨论】:

    猜你喜欢
    • 2016-03-07
    • 2021-12-18
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 2013-07-30
    相关资源
    最近更新 更多