C ++ 11移动和复制赋值运算符是否应返回const?
示例代码:
const my_class& operator=(const my_class& other)
{
// Copy the data
my_class tmp(other);
*this = std::move(tmp);
return *this;
}
const my_class& operator=(my_class&& other)
{
// Steal the data
std::swap(my_data_length, other.my_data_length);
std::swap(my_data, other.my_data);
return *this;
}
为清楚起见:
class my_class
{
protected:
double *my_data;
uint64_t my_data_length;
}
请注意返回类型上的const
。我通常不假思索地提出这个问题,但这是否真的有必要?返回const
阻止你做什么? (这里有一个例子。)
注意给出了一个例子但是它被删除了。任何人都可以评论以下内容吗? (a = b).non_const_member_function();
答案 0 :(得分:2)
不,他们绝对不应该返回对const的引用。典型的声明是:
my_class& operator=(const my_class& other)
my_class& operator=(my_class&& other)
根据cpprefernce:
为复制和移动分配返回T&
是要求满足CopyAssignable
和MoveAssignable
概念
答案 1 :(得分:0)
简短回答:不。
分配运营商和运营商,如const
e.t.c.应始终返回对类的引用,以便可以再次分配它:
如果返回std::string str = "Hello";
(str = "Hello World") += "!";//assign value to hello world then append !
,则无法执行以下操作,返回对象是不可变的。
const&
返回const
仍允许您执行声明为=
的函数,但不会修改容器,例如+=
,swap
,{{1}等等
答案 2 :(得分:0)
返回值可以用于链分配。所以const返回会阻止这样的系统:(a = b) = c
。由于a=b
返回一个const对象。