C ++移动赋值运算符返回类型

时间:2016-03-05 14:40:54

标签: c++

移动赋值运算符的正确返回类型是什么?

UIPopoverPresentationControllerDelegate

const type&

为什么? (我不认为我完全理解编译器如何确定l / r / x值。)

例如,考虑一个矢量类的实现。

函数可能会返回一个向量。

type&

我们希望vector myfunc() { vector v; // add content to v return v; } int main() { vector v2; v2 = myfunc; } 返回[?]到期值[?],即;我们希望调用移动赋值运算符,而不是复制赋值运算符。

复制赋值运算符可能如下所示:

myfunc

而移动赋值运算符可能如下所示:

const Vector& operator=(const Vector& vector)
{
    if(this != &vector)
    {
        if(m_capacity_x != vector.m_capacity_x)
        {
            delete [] m_data;
            m_data = new T[vector.m_capacity_x];
        }

        m_size = vector.m_size_x;
        m_capacity_x = vector.m_capacity_x;

        std::copy(&(vector.m_data[0]), &(vector.m_data[vector.m_size_x - 1]), m_data);
    }

    return *this;
}

但是返回类型是否正确?应该是Vector& operator=(Vector&& vector) { m_data = vector.m_data; m_size = vector.m_size; m_capacity = vector.m_capacity; m_data = nullptr; m_size = 0; m_capacity = 0; return *this; } [确实存在吗?]或Vector&&

3 个答案:

答案 0 :(得分:3)

我们可以问,分配给右值的重点是什么?分配通常在左值上完成,这就是你应该返回的内容。另外,如果你的值最初是const,为什么它会支持赋值?否则,如果它不是常数,为什么强制它?

因此,正常的过程就是赋值运算符总是返回一个非常数左值。

答案 1 :(得分:1)

通常,赋值运算符的返回类型为Vector&,但如果您不希望人们制作时髦的赋值链const Vector&,则可以接受(((v1 = v2) = v3) = v4)。移动作业和复制作业都是"赋值"。如果一个赋值运算符的返回类型与另一个不同,那将是出乎意料的,因此无论选择哪一个,都应该坚持使用。

返回Vector&&会非常奇怪。仅仅因为你使用了移动赋值运算符并不意味着你的对象神奇地是一个右值。您必须专门投射它,然后才有可能意外地从该实例中移出。

void some_function(Vector);
Vector get_some_Vector();

Vector f;
some_function(f = get_some_Vector()); //oops f is empty now

答案 2 :(得分:0)

我并不熟悉“移动分配操作员”。我使用了一些不支持c ++ 11的旧编译器,但是文档建议操作符应该只返回type&

http://en.cppreference.com/w/cpp/language/move_assignment

https://msdn.microsoft.com/en-us/library/dd293665.aspx

我刚刚搜索了c ++移动分配。

此外,在您的示例中,您没有从运算符返回任何内容。除非返回类型为void,否则应返回一些内容。