簡體   English   中英

C ++移動分配運算符返回類型

[英]C++ Move Assignment Operator Return Type

移動分配運算符的正確返回類型是什么?

const type&

要么

type&

又為什么呢? (我認為我不完全理解編譯器如何確定l / r / x值之間的關系。)

例如,考慮矢量類的實現。

函數可以返回向量。

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&& [是否存在嗎?]還是const Vector&

我們可以問,賦值給右值有什么意義? 賦值通常是在左值上完成的,因此應該返回該值。 另外,如果您的值最初是const,那么為什么要支持賦值? 否則,如果不是const,為什么要強制使用它?

因此,通常的情況是賦值運算符始終返回非常量左值。

通常,賦值運算符的返回類型是Vector& ,但是如果您不希望人們制作時髦的賦值鏈(((v1 = v2) = v3) = v4) ,則const Vector&是可以接受的。 移動分配和復制分配都是“分配”。 一個賦值運算符的返回類型與另一個賦值運算符不同,這是出乎意料的,因此無論您選擇哪個,都應該堅持。

返回Vector&&非常奇怪。 僅僅因為您使用了移動分配運算符,並不意味着您的對象在魔術上是一個右值。 您必須專門對其進行轉換,然后可能會意外地移出該實例。

void some_function(Vector);
Vector get_some_Vector();

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

我個人不熟悉“移動分配運算符”。 我與一些不支持c ++ 11的較舊的編譯器一起工作,但是文檔建議操作符應僅返回type&

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

https://msdn.microsoft.com/zh-CN/library/dd293665.aspx

我只是在搜索c ++移動分配。

另外,在您的示例中,您沒有從運算符返回任何信息。 除非返回類型為空,否則您應該返回一些內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM