C ++ 11移动和复制赋值运算符应该返回const吗?

时间:2015-08-26 10:13:24

标签: c++11

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();

3 个答案:

答案 0 :(得分:2)

不,他们绝对不应该返回对const的引用。典型的声明是:

my_class& operator=(const my_class& other)
my_class& operator=(my_class&& other)

根据cpprefernce:

CopyAssignable

MoveAssignable

为复制和移动分配返回T&是要求满足CopyAssignableMoveAssignable概念

答案 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对象。