當您有一個帶有移動構造函數的派生對象並且基礎對象也具有移動語義時,從派生對象移動構造函數調用基礎對象移動構造函數的正確方法是什麼?在派生對象上移動構造函數
我第一次嘗試的最明顯的事情:
Derived(Derived&& rval) : Base(rval)
{ }
然而,這似乎最終調用基對象的拷貝構造函數。然後我試圖明確使用std::move
這裏,像這樣:
Derived(Derived&& rval) : Base(std::move(rval))
{ }
這個工作,但我很困惑爲什麼它是必要的。我以爲std::move
只是返回一個右值引用。但是因爲在這個例子中rval
已經是一個右值引用,所以調用std::move
應該是多餘的。但如果我在這裏不使用std::move
,它只是調用複製構造函數。那麼爲什麼需要撥打std::move
?
如果你提供一個參數輸入作爲常規左值(不使用std :: move(xx)),只需要添加一個記錄而不管移動構造函數如何,你將得到「不能綁定'Xyy'左值爲'Xyy &&'定義爲foo(Xyy && xyy) – 2017-03-23 19:51:29