c++ - 这个赋值运算符后面的 & 是什么意思?

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

我正在阅读这篇 nice answer关于“五法则”,我注意到一些我不记得以前见过的东西:

class C {
  ...
  C& operator=(const C&) & = default;
  C& operator=(C&&) & = default;
  ...
};
& 的目的是什么? = default 前面的字符对于复制赋值运算符和移动赋值运算符?有人对此有引用吗?

最佳答案

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

在上述情况下,此处默认的复制赋值运算符只能在左值上调用。这使用了成熟的左值和右值引用绑定(bind)规则;这只是为 this 建立它们.

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

C c{};
c = C{};

这不是:
C{} = c;

这里的临时不能绑定(bind)到左值引用,因此不能调用复制赋值运算符。并且由于该声明将阻止创建通常的复制赋值运算符,因此该语法有效地防止了对临时对象的复制分配(或移动分配)。为了恢复它,您需要添加 &&版本:
C& operator=(const C&) && = default;
C& operator=(C&&) && = default;

关于c++ - 这个赋值运算符后面的 & 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62835306/

相关文章:

c++ - 如何压缩日志文件?

c++ - 无法在 C++ 中写入 4D vector (没有可行的重载 '=')

c++11 lambda 表达式问题(vs2012 update 1)

C++ 函数返回一个右值,但可以分配一个新值?

C++:如何检查文件/目录是否可读? (相当于 PHP:is_readable)

c++ - 按值或 C++11 通用引用传递仿函数?

c++ - 不重写类的部分模板特化

c++ - 错误 :template declaration of auto function

operator-overloading - 在 Fortran 重载赋值中检查自赋值

c# - 多重赋值(字段=属性=值)