3

基本クラスのmovectorを呼び出す正しい方法はどれですか?

これ(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で機能させる方法がわかりません(どちらのバージョンも機能しません)。

4

2 に答える 2

3

最初のオプションは論理的に見えますが、スペルはstd::forward<Bar>(other).

&otherの型がisBar&&であり notであると CBuilder が考える原因がわかりませんBar*

基本的にここで起こっていることは、右辺値参照に名前が付けられると、右辺値参照ではなくなるということですstd::forward。これが目的であり、右辺値を維持します (フレーズを作るため) : Foo(other)。コンストラクターを移動します。

これは、あなたがやろうとしていることを達成するための慣用的な(そして標準に準拠した)方法でなければなりません(私がFCDをひどく誤解していない限り)。

于 2010-11-01T11:38:05.023 に答える
0

最初のオプションは、キャストする必要がなく、転送する必要があることを除いて、標準に関して正しいものです。std::forward<Bar>(other)それ以外の場合は、移動コンストラクターを呼び出したいときにコピーコンストラクターを呼び出しています。

于 2010-11-01T12:15:16.223 に答える