2015-05-11 32 views
5

調用基類移動複製/分配構造函數我明白,無論何時在派生類中定義了自定義的複製構造函數或賦值運算符,那麼這些方法的責任就是調用相應的方法的基類。現在我的重點是移動構造函數。假設以下是我的移動構造函數。我有兩種方法調用基類構造函數。取自here我們應該從派生類

Derived(Derived&& d):Base(d) -->Form A 
{} 
Derived(Derived&& d):Base(std::move(d)) -->Form B 
{} 

現在哪種方法是正確的。從我的理解和從使用表單B的帖子上的最後一個答案是危險的和不正確的,因爲當派生類構造函數被調用時該對象將被取消。但是在formA中,基類複製構造函數被調用。打電話給FormA會更好嗎?同樣在移動複製賦值操作符中,調用基類賦值操作符和基類並不會更好。

回答

3

Form A不正確。它沒有實現移動語義。關於版本Form B,「dBase(std::move(d))取消」的說法不準確。準確的語句應爲「dBase部分(子對象)爲無效」。

此外,我建議你在調用基構造函數之前明確地將d轉換爲基類型。那就是,Base(std::move(static_cast<Base&>(d)))。這可以避免潛在的問題,如果Base有一個模板構造函數。例如,考慮Basestd::function的情況。如果沒有明確的演員表,您將以無限遞歸結束,因爲constructor (5)std::function

+2

如果你打算使用'static_cast',那麼使用'std :: move'有點多餘。只是'基地(std :: static_cast (d))'很好。 –

+0

@SiyuanRen用'static_cast'然後'move'的意圖看起來更清晰。 – Lingxi

相關問題