回答
移動構造函數只是另一個構造函數。如果重載構造函數,就像重載其他函數一樣,調用哪個構造函數的選擇歸結爲重載解析規則。也就是說,當你用Foo a(<some-expression>);
構造一個對象時,可能會有多個可能的構造函數,並且需要選擇一個。
複製構造函數帶有一個類型爲const Foo&
的參數。此左值引用類型將綁定到表示Foo
對象的任何表達式。移動構造函數採用Foo&&
類型的一個參數。這個右值引用只會綁定到可修改的右值。實際上,在通過可修改的右值的情況下,這個超載將是首選。
這意味着在Foo a(<some-expression>);
如果表達式<some-expression>
是一個可修改的右值,移動構造函數將被選中。否則,選擇複製構造函數。通常在表示臨時對象時會出現可修改的右值(例如,從函數返回的對象)。也可以通過使用std::move
(例如Foo a(std::move(b));
)將表達式強制爲右值表達式。
在你的Foo a(b)的例子中,'b'是一個命名對象,因此它不能是右值。這裏需要'std :: move(b)'。 –
@MichaelGazonda我將'b'視爲一般表達式,並非特別表達'b'。我會做得更清楚。 –
通常我們必須通過給出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.斯特勞斯)
- 1. Move構造函數調用基類移動構造函數
- 2. 用lambda調用移動構造函數
- 3. 與移動構造函數混淆:無法調用移動構造函數
- 4. 構造函數被「調用」與構造函數被「執行」?
- 5. 爲什麼移動構造函數不被調用?
- 6. 何時移動構造函數被調用?
- 7. 爲什麼我的C++移動構造函數未被調用?
- 8. emplace_back調用移動構造函數和析構函數
- 9. 當移動構造函數將在C++ 11中調用?
- 10. 爲什麼調用複製構造函數而不是移動構造函數?
- 11. 移動構造函數C++
- 12. 與移動構造函數
- 13. 移動構造函數不移動
- 14. 移動構造函數並移動類
- 15. 構造函數被調用多少次?
- 16. Rvalue構造函數沒有被調用?
- 17. 構造函數被調用TWice
- 18. NPE在構造函數被調用
- 19. 拷貝構造函數不被調用?
- 20. 構造函數被再次調用?
- 21. 構造函數沒有被調用
- 22. 基礎構造函數未被調用
- 23. ISerialization構造函數沒有被調用
- 24. 當一個構造函數被顯式調用時,是否構造了構造函數和成員變量?
- 25. 移動構造函數和非常拷貝構造函數
- 26. 當賦值運算符與複製構造函數被調用?
- 27. 爲什麼基礎移動構造函數的顯式調用實際上調用基礎構造函數?
- 28. 爲什麼移動構造函數在這種情況下不會被調用?
- 29. 使用boost :: pool_allocator時不會調用移動構造函數
- 30. 構造解釋爲函數調用,並移動構造strangly跳過
上的答案[該SO線程(http://stackoverflow.com/questions/3106110/what-is-move-semantics)將幫助你。 – wakjah