main:A a,b;には 2 つのオブジェクトがあり、 function f():の本体には 1 つのオブジェクトA b;があり、コピーされる一時オブジェクトとそのコピーが に格納されbます。
関数の本体に戻るbと、最初にコピーが作成され、次にローカルが破棄され、次にコピーがメインで宣言bされた変数に割り当てられ、次にこのコピーが破棄されます。b
次の行をクラスA定義に追加して、自分自身を確認してください。
A(const A&) { cout << "copying" << endl; }
Named Return Value Optimizationを使用すると、コンパイラは冗長な Copy コンストラクターと Destructor 呼び出しを排除しようとしますb。これは、コピーが作成されることなく、関数のローカルが main のf()変数に割り当てられることを意味します。bしたがって、RVO / NRVO では、3 つのオブジェクトのみが作成されます。
あなたの場合、RVOなしでこのコピーを破壊しないようにする方法はありますが:
A a;
A b = a.f();
この場合、関数の戻り値のコピーf()が作成され、変数として保存されますb。これは、代入演算子が呼び出されず、2 つのオブジェクトのみが main: で作成され、によって返されるaのコピーが作成されることも意味します。bf()
お役に立てれば。