0

次のコードがあります。

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 は左辺値であるため、戻りオブジェクトは移動コンストラクターではなくコピーコンストラクターを使用して初期化する必要があるということです。

私は何が欠けていますか?誰かがそのケースが解明されている標準の段落を指摘できますか?

4

2 に答える 2