次のコードがあります。
SomeClass func()
{
SomeClass someObject;
someObject.mutate("some text");
return someObject;
}
int main()
{
func();
return 0;
}
SomeClass はコンストラクターに何かを記録するだけなので、何が呼び出されているかを確認できます。
リリースビルドでは、次の出力があります。
default constructor
これは、コピー/移動の省略により理にかなっています。戻り値の最適化をオフにしたかったのです。デバッグビルドを使用すると、次の出力が得られます。
default constructor
move constructor
ここで、NRVO si を安全にオフにできると思います。コピー コンストラクターの代わりにムーブ コンストラクターが呼び出される理由が本当に不思議です。私の(おそらく間違っている)理解は、 func の someObject は左辺値であるため、戻りオブジェクトは移動コンストラクターではなくコピーコンストラクターを使用して初期化する必要があるということです。
私は何が欠けていますか?誰かがそのケースが解明されている標準の段落を指摘できますか?