ある本で、「オブジェクトが関数によって返されると、戻り値を保持する一時オブジェクトが自動的に作成されます。関数によって実際に返されるのはこのオブジェクトです。値が返された後、このオブジェクトは破棄されます。」
ここで言われていることを正確に完全に理解することはできません。
// Returning objects from a function.
#include <iostream>
using namespace std;
class myclass
{
int i;
public:
myclass()
{
cout << "constructing: " << i << endl;
}
~myclass()
{
cout << "destructing: " << i << endl;
}
void set_i(int n) { i=n; }
int get_i() { return i; }
};
myclass f(); // return object of type myclass
int main()
{
myclass o;
o = f();
cout << o.get_i() << "\n";
return 0;
}
myclass f()
{
myclass x;
x.set_i(1);
return x;
}
上記のプログラムは、次の出力を提供します。
constructing: 0
constructing: 3935896
destructing: 1
1
destructing: 1
私の質問は:
f() から "x" が返された場合、本によると一時オブジェクトが作成されているはずです。ただし、「x」のコピーが作成されているため、「constructing:」は出力されないため、コンストラクターの呼び出しは冗長です (これは、オブジェクトを関数に渡すときに、そのデストラクタのみが呼び出されるのと同じ理由です)。 .
しかし、その一時オブジェクトが破棄されると、なぜそのデストラクタが呼び出されないのでしょうか?