次の関数について考えてみます。
Foo foo(Foo x)
{
return x;
}
return x
コピーコンストラクターまたは移動コンストラクターを呼び出しますか?(ここでNRVOを脇に置いておきましょう。)
調査するために、Foo
移動可能でコピー可能ではない単純なクラスを作成しました。
struct Foo
{
Foo() = default;
Foo(const Foo&) = delete;
Foo(Foo&&) = default;
};
値パラメーターを値で返すときにmoveコンストラクターが呼び出された場合は、すべて問題ないはずです。return x
しかし、現在のg ++コンパイラは、次のエラーメッセージで文句を言います。
error: deleted function 'Foo::Foo(const Foo&)'
に置き換えるreturn x
とreturn std::move(x)
、すべて問題ありません。このことから、必要に応じて、値パラメーターからの移動を明示的に実行する必要があると結論付けます。g ++の動作は準拠していますか?