2014-12-21 156 views
5

我想知道什麼時候移動構造函數在C++代碼中調用。當移動構造函數被調用

這意味着,我知道當我打電話給Foo a(b)它是複製構造函數,所以我有什麼代碼來調用移動構造函數。

+0

上的答案[該SO線程(http://stackoverflow.com/questions/3106110/what-is-move-semantics)將幫助你。 – wakjah

回答

4

移動構造函數只是另一個構造函數。如果重載構造函數,就像重載其他函數一樣,調用哪個構造函數的選擇歸結爲重載解析規則。也就是說,當你用Foo a(<some-expression>);構造一個對象時,可能會有多個可能的構造函數,並且需要選擇一個。

複製構造函數帶有一個類型爲const Foo&的參數。此左值引用類型將綁定到表示Foo對象的任何表達式。移動構造函數採用Foo&&類型的一個參數。這個右值引用只會綁定到可修改的右值。實際上,在通過可修改的右值的情況下,這個超載將是首選。

這意味着在Foo a(<some-expression>);如果表達式<some-expression>是一個可修改的右值,移動構造函數將被選中。否則,選擇複製構造函數。通常在表示臨時對象時會出現可修改的右值(例如,從函數返回的對象)。也可以通過使用std::move(例如Foo a(std::move(b));)將表達式強制爲右值表達式。

+1

在你的Foo a(b)的例子中,'b'是一個命名對象,因此它不能是右值。這裏需要'std :: move(b)'。 –

+0

@MichaelGazonda我將'b'視爲一般表達式,並非特別表達'b'。我會做得更清楚。 –

3

通常我們必須通過給出rvalue參考參數來告訴它。例如:

template<class T> 
void swap(T& a, T& b) 
{ 
    T tmp = std::move(a); 
    a = std::move(b); 
    b = std::move(tmp); 
} 

move()是一個標準的庫函數返回一個rvalue參照其參數 move(x)意味着「給我一個rvalue參考×」。也就是說,std::move(x)不會移動任何東西,相反,它允許用戶移動x。

來源:C++程序設計語言(B.斯特勞斯)

相關問題