2010-11-01 61 views
3

哪個是調用基類移動ctor的正確方法?調用基類移動ctor [C++ 0x]

這(在MSVC2010作品,但不是在CBuilder2010):

struct Foo 
{ 
    Foo(Foo&& other) { } 
}; 

struct Bar : public Foo 
{ 
    Bar(Bar&& other) : Foo((Foo&&)other) { } 
}; 

或(在CBuilder2010工作,但不是在MSVC2010):

struct Foo 
{ 
    Foo(Foo&& other) { } 
}; 

struct Bar : public Foo 
{ 
    Bar(Bar&& other) : Foo(&other) { } 
}; 

,或者是他們都錯了嗎?如果是這樣,什麼是正確的方式(根據C++ 0x標準中規定的內容)?

注意:我無法弄清楚如何讓它在CBuilderXE中工作(兩個版本都不起作用)。

+0

'Foo(&other)'不應該編譯,除非Foo有一個需要Foo指針的ctor。 – 2010-11-01 13:25:26

回答

3

第一個選項看起來很合理,但我會拼寫它std::forward<Bar>(other)

我不知道是什麼原因導致CBuilder認爲&other的類型是Bar&&而不是Bar*

基本上這裏發生了什麼是一旦一個右值引用名爲它不再是一個右值引用,這就是std::forward是,它保持rvaluness(套用一句話),所以當你打電話: Foo(other)你打電話複製構造函數而不是移動構造函數。

這應該是實現你想要做的事情的慣用方法(並且符合標準),除非我誤解FCD。

+0

雖然在標準中說了什麼?我的問題是,現在每個C++ 0x標準中哪一個是正確的。 – 2010-11-01 11:53:57

+0

顯然與CBuilderXE,std ::轉發(其他)作品,但(Foo &&)不。看起來像另一個編譯器錯誤(這並不奇怪)。 – 2010-11-01 12:07:32

+0

@Zach我已經擴展了我的答案,以回答你的問題。 – Motti 2010-11-01 12:18:27

0

第一種選擇是標準方面的正確選擇 - 除非您不必投射它並且應該轉發它。 std::forward<Bar>(other)是正確的方式 - 否則,當您要調用移動構造函數時調用複製構造函數。

+0

第一個選項會導致MSVC++ 2010調用基類的移動c'tor。從我可以告訴,std :: foward (其他)在這種情況下是相同的static_cast (其他)。是的,如果你沒有投它(這在本例中基本上是std :: forward),你最終會得到copy c'tor。 – 2010-11-01 12:19:37