1
我有一個實現移動構造函數的類Bar
。將對象移動到foo(Bar &&)函數
對於一個示例Bar b
,如果我使用fooRvalRef(std::move(b))
調用void fooRvalRef(Bar&&)
,則不會調用Bar的移動構造函數。
另一方面,對於函數void foo(Bar)
,使用foo(std::move(b))
調用它將調用Bar的移動構造函數。
這是爲什麼?
我有一個實現移動構造函數的類Bar
。將對象移動到foo(Bar &&)函數
對於一個示例Bar b
,如果我使用fooRvalRef(std::move(b))
調用void fooRvalRef(Bar&&)
,則不會調用Bar的移動構造函數。
另一方面,對於函數void foo(Bar)
,使用foo(std::move(b))
調用它將調用Bar的移動構造函數。
這是爲什麼?
std::move
試圖將參數變成一個右值引用,就是這樣,它不會移動該對象。由於它調用fooRvalRef
成功,因此不需要移動構造函數,它只是將右值引用傳遞給右值引用參數。
在foo(Bar)
的情況下,您正在傳值,因此通常會調用複製構造函數。然而在這種情況下,你有一個移動構造函數,並且你傳遞了一個右值引用,這要歸功於std::move
,所以移動構造函數被調用。
[爲什麼'std :: move'命名爲'std :: move'?](http://stackoverflow.com/q/21358432/3953764) –