f()
は値で返されるため、一時的なものを返す必要があります。のようT a = x;
に、一時的に渡されたものを引数として、T a(x);
の構築のためにコピーコンストラクターを呼び出しませんか?a
戻り値の最適化を検索します。これはデフォルトでオンになっています。MSVC 2005+を使用しているWindowsを使用している場合は、/Od
これをオフにして、目的の結果(または-fno-elide-constructors
GCC)を取得するために使用できます。また、MSVCについては、この記事を参照してください。
12.8クラスオブジェクトのコピー
15特定の基準が満たされると、オブジェクトのコピーコンストラクタやデストラクタに副作用がある場合でも、実装はクラスオブジェクトのコピー構築を省略できます。このような場合、実装は、省略されたコピー操作のソースとターゲットを、同じオブジェクトを参照する2つの異なる方法として扱い、そのオブジェクトの破棄は、2つのオブジェクトが最適化。115このコピー操作の省略は、次の状況で許可されます(複数のコピーを削除するために組み合わせることができます)。
—クラスreturn型の関数のreturnステートメントで、
式が関数return型と同じcv-unqualified型の不揮発性自動オブジェクトの名前である場合、自動を構築することでコピー操作を省略できます。オブジェクトを関数の戻り値に直接— throw-expressionで、オペランドが非揮発性の自動オブジェクトの名前である場合、自動オブジェクトを直接作成することにより、オペランドから例外オブジェクト(15.1)へのコピー操作を省略できます。例外オブジェクトに
—参照(12.2)にバインドされていない一時クラスオブジェクトが同じcv-unqualifiedタイプのクラスオブジェクトにコピーされる場合、省略されたターゲットに一時オブジェクトを直接構築することにより、コピー操作を省略できます。コピー
—例外ハンドラの例外宣言(15節)が例外オブジェクト(15.1)と同じタイプのオブジェクト(cv-qualificationを除く)を宣言する場合、例外宣言を例外宣言によって宣言されたオブジェクトのコンストラクタとデストラクタの実行を除いて、プログラムの意味が変更されない場合は、例外オブジェクトのエイリアス。
注:強調鉱山