MyClass
次のように関数の引数として新しいインスタンスを作成する場合:
class MyClass
{
MyClass(int a);
};
myFunction(MyClass(42));
標準ではデストラクタのタイミングについて何らかの保証がなされていますか?
具体的には、 の呼び出し後の次のステートメントの前に呼び出されると想定してよいですかmyFunction()
?
ベストアンサー1
一時オブジェクトは、それが属する完全な式の終了時に破棄されます。
完全な式とは、他の式のサブ式ではない式のことです。通常、これは、ステートメントの終わりを示す;
(または)
、if
などwhile
のswitch
場合)で終了することを意味します。あなたの例では、関数呼び出しの終わりです。
一時オブジェクトの有効期間を参照にバインドすることで延長できることに注意してくださいconst
。これにより、一時オブジェクトの有効期間が参照の有効期間まで延長されます。
MyClass getMyClass();
{
const MyClass& r = getMyClass(); // full expression ends here
...
} // object returned by getMyClass() is destroyed here
返されたオブジェクトを変更する予定がない場合は、MyClass obj = getMyClass();
戻り値の最適化が適用されていない場合に、これはコピー コンストラクターの呼び出しを ( と比較して) 節約する便利なトリックです。残念ながら、これはあまり知られていません。(ただし、C++11 の移動セマンティクスにより、あまり役に立たなくなると思います。)