簡體   English   中英

在派生對象上移動構造函數

[英]Move constructor on derived object

當您有一個帶有移動構造函數的派生對象,並且基對象也具有移動語義時,從派生對象移動構造函數調用基對象移動構造函數的正確方法是什么?

我首先嘗試了最明顯的事情:

 Derived(Derived&& rval) : Base(rval)
 { }

但是,這似乎最終會調用 Base 對象的復制構造函數 然后我嘗試在這里明確使用std::move ,如下所示:

 Derived(Derived&& rval) : Base(std::move(rval))
 { }

這有效,但我很困惑為什么有必要。 我認為std::move僅返回一個右值引用。 但是因為在這個例子中rval已經是一個右值引用,對std::move的調用應該是多余的。 但是如果我在這里不使用std::move ,它只會調用復制構造函數。 那么為什么需要調用std::move呢?

rval不是右值。 它是移動構造函數體內的一個左值。 這就是我們必須顯式調用std::move

參考這個 重要的注意事項是

注意上面的參數 x 被視為移動函數內部的左值,即使它被聲明為右值引用參數。 這就是為什么在傳遞給基類時必須說 move(x) 而不僅僅是 x 。 這是移動語義的一個關鍵安全特性,旨在防止從某個命名變量意外移動兩次。 所有移動僅發生在右值,或顯式轉換為右值,例如使用 std::move。 如果您有變量的名稱,則它是左值。

命名的 R 值引用被視為 L 值。

所以我們需要std::move將其轉換為 R-Value。

你真的應該使用 std::forward(obj) 而不是 std::move(obj) 。 Forward 將根據 obj 是什么返回正確的右值或左值,而 move 會將左值轉換為右值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM