2016-03-05 96 views
0

移動賦值運算符的正確返回類型是什麼?C++移動賦值運算符返回類型

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&

+3

您的「分配」操作員實際上都格式化硬盤驅動器。請返回*東西*。 – Fanael

+0

@Fanael err,格式化硬盤驅動器? – user3728501

+1

未定義返回非返回值時返回非'void'的函數結束時的行爲。 – Fanael

回答

1

通常情況下,賦值運算符的返回類型爲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 
+0

你的代碼示例是做什麼的? – user3728501

+0

@ user3728501我稍微改了一些例子,但基本上這是調用一個函數來獲得一個新的'Vector'並將其賦值給'f',然後調用一個在'f'的新值上運行的函數。如果你從移動賦值中返回'Vector &&',在函數調用結束時,'f'可能是空的。 –

+0

我還是不明白。 'Vector &&'在這裏如何解釋? – user3728501

0

我個人不熟悉「移動賦值操作符」。我與一些不支持C++ 11的較老的編譯器一起工作,但文檔建議操作員應該只返回type&

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

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

我只是做了針對C++搜索移動分配。

另外,在您的示例中,您沒有從操作員返回任何內容。你應該返回一些東西,除非返回類型是無效的。

+0

是的,我會補充 – user3728501

3

我們可以問,賦值給右值有什麼意義?分配通常在左值完成,所以這就是你應該返回的。另外,如果你的值最初是const,爲什麼它會支持賦值?否則,如果它不是const,爲什麼強制它?

因此,事情的正常過程是賦值操作符總是返回一個非const的左值。

+0

這是一個非常有見地的評論,謝謝。 – user3728501