1. ホーム
  2. c++

C++: 一時引数の寿命?

2023-10-26 09:11:41

質問

新しいインスタンスを作成する際に MyClass のような関数の引数として

class MyClass
{
  MyClass(int a);
};    

myFunction(MyClass(42));

規格では、デストラクタのタイミングについて何か保証されていますか?

具体的に言うと myFunction() ?

どのように解決するのですか?

一時的なオブジェクトは、その一部である完全な式の終了時に破棄されます。

完全な式とは、他の式の部分式でない式のことです。通常、これは ; (または ) に対して 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 の移動セマンティクスにより、あまり有用でなくなるとは思いますが)。