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 がデフォルトで最適化ジョブを実行する場合、なぜ移動コンストラクターを実装する必要があるのでしょうか?