ホームページ >バックエンド開発 >C++ >C ではなぜ一時オブジェクトが驚くべき順序で破棄されるのでしょうか?

C ではなぜ一時オブジェクトが驚くべき順序で破棄されるのでしょうか?

DDD
DDDオリジナル
2024-11-13 08:54:02343ブラウズ

Why Are Temporary Objects Destroyed in a Surprising Order in C  ?

C での一時オブジェクトの破棄

提供されたコードは、一時オブジェクトが予期しない順序で破棄されるという驚くべき動作を示しています。ただし、この動作は実際には C 標準によって保証されています。

説明

名前のないオブジェクトとも呼ばれる一時オブジェクトは、式が次のように評価されるときに作成されます。参照型ではないクラス型。これらは通常、式の評価中に中間結果を保持するために使用されます。

指定されたコードでは、Foo 型の一時オブジェクトが文字列リテラルから作成され、オブジェクトの有効期間が終了するとそのデストラクターが呼び出されます。デストラクターは、オブジェクトの m_name メンバーに格納されている名前を出力します。

一時オブジェクトの有効期間は、それが作成された完全な式の終了時に終了します。提供されたコードでは、完全な式は次のステートメントです。

Foo{ "one" };

したがって、一時オブジェクトの有効期間は、このステートメントに続くセミコロンで終了します。その結果、一時オブジェクトのデストラクターが呼び出され、文字列「one」が出力されます。

ルールの例外

一般的なルールでは次のように規定されています。一時オブジェクトは完全な式の最後に破棄されます。C 標準で指定されている例外がいくつかあります ([class.temporary] p5-p7):

  • 配列の初期化子でデフォルトで構築された一時オブジェクトの有効期間を短縮します。
  • 配列のコピー中にコンストラクターへのデフォルト引数の有効期間を短縮します。
  • 一時オブジェクトへの参照をバインドすることで、その存続期間を延長します。
  • オブジェクトの存続期間を延長します。

これらの例外により、特定の状況における一時オブジェクトの有効期間をより柔軟に管理できるようになります。

以上がC ではなぜ一時オブジェクトが驚くべき順序で破棄されるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。