[C ++ 11:12.8 / 31]に記載されています:
コピーの省略と呼ばれるこのコピー/移動操作の省略は許可されています[...]:
—クラスreturn型を持つ関数のreturnステートメントで、式が、関数return型と同じcv-unqualified型を持つ不揮発性自動オブジェクト(関数またはcatch-clauseパラメーター以外)の名前である場合、自動オブジェクトを関数の戻り値に直接構築することにより、コピー/移動操作を省略できます。
これは、
#include <iostream>
using namespace std;
struct X
{
X() { }
X(const X& other) { cout << "X(const X& other)" << endl; }
};
X no_rvo(X x) {
cout << "no_rvo" << endl;
return x;
}
int main() {
X x_orig;
X x_copy = no_rvo(x_orig);
return 0;
}
印刷します
X(const X& other)
no_rvo
X(const X& other)
2番目のコピーコンストラクタが必要なのはなぜですか?コンパイラは単にxの寿命を延ばすことはできませんか?