はい、あなたが持っているものは正しいです。使用する必要があるstd::move
か、コードがコンパイルされません。理由はすぐにはわからないかもしれません。次のように関数を呼び出すと:
AClass *a = aFunction(BigClass{});
aFunction
BigClass
のデフォルトコンストラクタからの戻り値である右辺値で呼び出されます。しかし、内部aFunction
では、変数bc
は左辺値です。名前がある場合、それは左辺値であることを忘れないでください。の move コンストラクターを使用するにはbc
、右辺値に変換する必要があります。std::move
AClass
これをより明確に確認するために、いくつかの出力 (およびコピー コンストラクター) を に追加してみましょう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
、コピーが取得されます。それがあれば、あなたは動きを得るでしょう。