【发布时间】:2021-04-16 01:24:38
【问题描述】:
class base
{
public:
base(const base&) = delete;
base()
{
cout << "construct" << endl;
}
~base()
{
cout << "destruct" << endl;
}
int a;
int b;
/* The difference explanation I desired is here */
void operator=(base&& other)
// base& operator=(base&& other) // this needs to collaborate with "return *this"
{
this->a = other.a;
this->b = other.b;
// return *this;
}
/* Not here */
base& operator=(base& other) = delete;
};
operator=(T&&) 的两个版本有什么区别?他们似乎都对我有用。但是,作为类成员函数,网站推荐base& operator=(T&&)版本。
【问题讨论】:
-
请将您的帖子限制在一个问题上。我建议将后半部分作为一个单独的问题发布。
-
显示的两个重载之间的区别主要不在于它们返回的内容,而在于它们作为参数的内容。采用
base&& other(右值引用)的那个是移动赋值运算符。采用base& other(左值引用)的那个是复制赋值运算符。移动赋值操作符可以——而且通常确实——也可以返回base&,没有充分的理由让它成为void -
两者的用法不同。返回
base &的复制分配表单(如果未删除)可以链接,例如x = y = z其中x、y和z都是base类型。返回void的移动分配不能被链接。具有返回void的移动分配和删除的副本分配的最终效果是,仅允许将临时变量作为右值的分配,并且不允许链接。 -
赋值运算符可以返回任何有意义的值,包括
void。期望它返回对对象本身的引用,但这不是必需的。对于某些课程,甚至作为团队的标准政策,可能有充分的理由“挑战现状”。
标签: c++ operator-overloading return-value assignment-operator