2

[簡略化された]コードがあります:

class AClass{
public:
    AClass( BigClass && bc ) : m_bc{std::move(bc)} {}

private:
    BigClass m_bc;
};

AClass * aFunction( BigClass && bc ){
    return new AClass( std::move(bc) );
}

できます。しかし、それは正しいですか?BigClass データは、一時的なものを作成せずに呼び出しに沿って移動しますか?

4

1 に答える 1

0

はい、あなたが持っているものは正しいです。使用する必要があるstd::moveか、コードがコンパイルされません。理由はすぐにはわからないかもしれません。次のように関数を呼び出すと:

AClass *a = aFunction(BigClass{});

aFunctionBigClassのデフォルトコンストラクタからの戻り値である右辺値で呼び出されます。しかし、内部aFunctionでは、変数bc左辺値です。名前がある場合、それは左辺値であることを忘れないでください。の move コンストラクターを使用するにはbc、右辺値に変換する必要があります。std::moveAClass

これをより明確に確認するために、いくつかの出力 (およびコピー コンストラクター) を に追加してみましょうAClass

AClass( BigClass & bc ) : m_bc{bc} { std::cout << "Copy\n"; }
AClass( BigClass && bc ) : m_bc{std::move(bc)} { std::cout << "Move\n"; }

std::move除外するとaFunction、コピーが取得されます。それがあれば、あなたは動きを得るでしょう。

于 2013-03-15T02:08:53.870 に答える