2016-01-23 119 views
1

什麼是移動構造函數的正確方法?移動構造函數C++

class A{ 
...some stuff... 
private: 
    int i; 
    std::string str; 
}; 

A::A(A &&a) 
{ 
    *this = std::move(a); 
}; 

A::A(A &&a) 
{ 
    this->str = std::move(a.str); 
}; 

在第二種情況下,它是有用的爲std ::移動()int值?

+0

無論如何,我認爲你應該明確地設置int。此時,該值保持未初始化狀態。無論如何,在第一種情況下,您只需將移動構造函數重定向到copy/move-operator =(無論您實現哪個)。由於operator =在移動構造函數被聲明時被隱式刪除,所以會產生編譯錯誤。如果你實現移動賦值,我不認爲第一種情況是錯誤的,但它看起來類似於你是第二個移動構造函數。 – Herbert

+0

第二個選項只移動字符串,而不是對象本身。 你想移動對象及其成員,還是想克隆它? 移動意味着「移動語義」,而後者意味着「克隆」。 –

回答

6

應該

A::A(A&& other) 
    : i{other.i}, 
     str{std::move(other.str)} { 
    // nop 
} 

這是一個移動構造函數的默認實現。

+0

這不等於第二種情況(除了不初始化i)嗎? – Herbert

+0

i {other.i} 和 i(other.i) ?之間存在差異? – Milow

+0

@赫伯特他們不是等價的。見[這裏](http://en.cppreference.com/w/cpp/language/initializer_list)。 – Lingxi