次のコードでは:
Widget makeWidget()
{
return Widget();
}
void foo(Widget widget)
{
...
}
foo(makeWidget());
Widget オブジェクトは常にインプレース (foo 関数内) で構築されるため、move 構築は行われません (少なくとも私が試したすべてのコンパイラで)。move の構築が実際に行われる方法で一時的な値を関数に渡す簡単な例は何ですか?
次のコードでは:
Widget makeWidget()
{
return Widget();
}
void foo(Widget widget)
{
...
}
foo(makeWidget());
Widget オブジェクトは常にインプレース (foo 関数内) で構築されるため、move 構築は行われません (少なくとも私が試したすべてのコンパイラで)。move の構築が実際に行われる方法で一時的な値を関数に渡す簡単な例は何ですか?
この場合の省略の基準は次のとおりです。
参照にバインドされていない一時クラス オブジェクトが、同じ cv 非修飾型のクラス オブジェクトにコピー/移動される場合
したがって、省略を防ぐ簡単な方法は、それを参照にバインドすることです。
foo(std::move(makeWidget());
Gcc-fno-elide-constructors
には、コピー省略を無効にするフラグがあります。このオプションを使用すると、両方の移動がサンプル コードで実行されます。