ホームページ > バックエンド開発 > C++ > C では一時オブジェクトの破棄順序は保証されていますか?

C では一時オブジェクトの破棄順序は保証されていますか?

Susan Sarandon
リリース: 2024-11-12 07:49:01
オリジナル
950 人が閲覧しました

Is the Destruction Order of Temporary Objects Guaranteed in C  ?

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

次のコードを考慮すると、

#include <iostream>

struct Foo
{
    const char* m_name;

    ~Foo() { std::cout << m_name << '\n'; }
};

int main()
{
    Foo foo{"three"};
    Foo{"one"};   // unnamed object
    std::cout << "two" << '\n';
}
ログイン後にコピー

出力が次のようになることは明らかです。 「1」、「2」、「3」になります。ここで疑問が生じます: この動作はすべての C コンパイラで保証されていますか?

C 標準によると、[class.temporary] には次のように記載されています。

「一時オブジェクトは最後のオブジェクトとして破棄される」このルールは、提供されたコード内の名前のない Foo オブジェクトなどの一時オブジェクトが最後に破棄されることを意味します。

[class.temporary] p5、p6 で概説されているように、この一般規則には例外があることに注意することが重要です。 、および p7:

配列初期化子でデフォルトで構築された一時オブジェクトの有効期間を短縮します。
  1. 配列のコピー中にコンストラクターへのデフォルト引数の有効期間を短縮します。
  2. 一時オブジェクトへの参照をバインドすることで、一時オブジェクトの有効期間を延長します。
  3. 「for-range-initializer」で一時オブジェクトの有効期間を延長します。
  4. ただし、提供されたコードでは、これらの例外はどれも適用されず、それぞれの式の最後で一時オブジェクトが確実に破棄されます。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート