我正在阅读这个关于“五法则”的好答案,我注意到了一些我以前没有见过的东西:
class C {
...
C& operator=(const C&) & = default;
C& operator=(C&&) & = default;
...
};
对于复制赋值运算符和移动赋值运算符,放在=default
前面的&
字符的用途是什么? 有人对此有参考资料吗?
它是允许C++11非静态成员函数区分它们是在lvalues上调用还是在rvalues上调用的特性的一部分。
在上面的情况下,这里默认的复制赋值运算符只能在lvalues上调用。 这将使用已建立的lvalue和rvalue引用绑定规则; 这只是为this
建立它们。
在上述情况下,只有当要复制到的对象可以绑定到非常量值引用时,才默认使用复制赋值运算符。 所以这很好:
C c{};
c = C{};
这不是:
C{} = c;
此处的临时值无法绑定到lvalue引用,因此无法调用复制赋值运算符。 并且由于该声明将阻止创建通常的复制赋值运算符,因此该语法有效地阻止了对临时对象的复制赋值(或移动赋值)。 为了还原,您需要添加&&
版本:
C& operator=(const C&) && = default;
C& operator=(C&&) && = default;
这意味着该函数只能在lvalues上调用。 因此这将失败,因为赋值运算符函数是在rvalue对象表达式上调用的:
C() = x;