2016-04-17 70 views
1

我有一個實現移動構造函數的類Bar將對象移動到foo(Bar &&)函數

對於一個示例Bar b,如果我使用fooRvalRef(std::move(b))調用void fooRvalRef(Bar&&),則不會調用Bar的移動構造函數。

另一方面,對於函數void foo(Bar),使用foo(std::move(b))調用它將調用Bar的移動構造函數。

這是爲什麼?

+0

[爲什麼'std :: move'命名爲'std :: move'?](http://stackoverflow.com/q/21358432/3953764) –

回答

3

std::move試圖將參數變成一個右值引用,就是這樣,它不會移動該對象。由於它調用fooRvalRef成功,因此不需要移動構造函數,它只是將右值引用傳遞給右值引用參數。

foo(Bar)的情況下,您正在傳值,因此通常會調用複製構造函數。然而在這種情況下,你有一個移動構造函數,並且你傳遞了一個右值引用,這要歸功於std::move,所以移動構造函數被調用。

相關問題