`std::initializer_list` 戻り値の有効期間が GCC と Clang で異なるのはなぜですか?

Mary-Kate Olsen
リリース: 2024-10-28 10:06:02
オリジナル
969 人が閲覧しました

Why Does the Lifetime of an `std::initializer_list` Return Value Differ Between GCC and Clang?

std::initializer_list の有効期間 戻り値: GCC と Clang の動作

提供されたコードでは、std を返しています。 ::initializer_list を関数から取得し、予期しないデストラクターの動作を観察します。具体的には、関数から返された配列は、その要素にアクセスする前に破棄されます。

根本的な問題は、C 標準によれば、std::initializer_list には次のような要素の配列が含まれるという事実から生じます。 initializer_list と同じ有効期間で構築されます。これは、デフォルトでは、関数の return ステートメントの最後で配列が破棄されることを意味します。

GCC の実装はこの動作に準拠していますが、Clang は準拠していません。 Clang は、return ステートメントの終了後も配列の有効期間を維持しますが、これは標準に準拠していません。ただし、オブジェクト デストラクターが決して呼び出されないため、Clang の動作には一貫性がないように見えます。

Copy-List-Initialization と Compiler Interpretations

中括弧付きの init- を含む return ステートメントlist は、copy-list-initialization を通じて戻り値を初期化します。これは、既存のオブジェクトをコピー初期化することを意味します。この場合、一時的なinitializer_listオブジェクトが中括弧で囲まれたリストからコピー初期化されます。続いて、別のinitializer_listオブジェクトが最初からコピー初期化されます。

標準では、配列の有効期間はinitializer_listオブジェクトと同じであると規定されていますが、initializer_listの複数のコピーが作成されるため、どのオブジェクトの有効期間が決定するかは不明です。配列の寿命。

GCC は、返されたInitializer_list オブジェクトの寿命を考慮して標準を解釈するため、配列が早期に破棄されます。ただし、8.5.4/6 で提供されている例では、配列の有効期間が、受信関数を含む囲み式の終わりまで延長される必要があることが示唆されています。

コンパイラの動作と標準の曖昧さの概要

  • GCC: 標準に従い、return ステートメントの最後で配列を破棄します。
  • Clang: return ステートメントを超えて配列の有効期間を延長しますが、オブジェクト デストラクターを適切に破棄できません。
  • どのInitializer_list オブジェクトが配列の有効期間を決定するかに関して標準は曖昧です。

推奨事項

予期しない動作を避けるため、通常は推奨されませんstd::initializer_list を値で返します。可変数のオブジェクトを渡す必要がある場合は、代わりに std::vector などのコンテナ クラスの使用を検討してください。

以上が`std::initializer_list` 戻り値の有効期間が GCC と Clang で異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!