2

SO に関するいくつかの質問から、(N)RVO は、オブジェクトが値によって返されるときに移動コンストラクターが呼び出されないようにすることを理解しました。古典的な例:

struct Foo {
  Foo()            { std::cout << "Constructed\n"; }
  Foo(const Foo &) { std::cout << "Copy-constructed\n"; }
  Foo(Foo &&)      { std::cout << "Move-constructed\n"; }
  ~Foo()           { std::cout << "Destructed\n"; }
};

Foo makeFoo() {
  return Foo();
}

int main() { 
  Foo foo = makeFoo(); // Move-constructor would be called here without (N)RVO
}

(N)RVO を有効にした場合の出力は次のとおりです。

Constructed
Destructed

では、(N)RVO の存在に関係なく、move コンストラクターが呼び出されるのはどのような場合でしょうか? いくつか例を挙げていただけますか?言い換えれば、(N)RVO がデフォルトで最適化ジョブを実行する場合、なぜ移動コンストラクターを実装する必要があるのでしょうか?

4

1 に答える 1