これはCopy Elision Ref 1:です。
一時オブジェクトの生成中にコンストラクター呼び出しをコピーすることは、オブジェクトをインラインで作成することによってコンパイラーによって最適化される可能性があり、C++ 標準によって明示的に許可されています。
これは、例とともに標準でもうまく実証されています。
C++03 標準 12.2 一時オブジェクト [class.temporary]
パラ 2:
[Example:
class X {
// ...
public:
// ...
X(int);
X(const X&);
˜X();
};
X f(X);
void g()
{
X a(1);
X b = f(X(2));
a = f(a);
}
ここで、実装は、 X のコピー コンストラクターX(2)
を使用して渡す前に、構築する一時的なものを使用する場合があります。f()
あるいは、X(2)
引数を保持するために使用されるスペースに構築される場合があります。また、 X f() a=f(a) f(a) a`f(X(2))
にコピーする前に結果を保持するためにテンポラリが使用される場合があります。]`b using
’s copyconstructor; alternatively,
’s result might be constructed in b. On the other hand, the expression
requires a temporary for either the argument a or the result of
to avoid undesired aliasing of
参照 1:
C++03 12.8 クラス オブジェクトのコピー [class.copy]
パラ 12:
特定の基準が満たされると、オブジェクトのコピー コンストラクターおよび/またはデストラクタに副作用がある場合でも、実装はクラス オブジェクトのコピー構築を省略できます.....