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 で提供されている例では、配列の有効期間が、受信関数を含む囲み式の終わりまで延長される必要があることが示唆されています。
コンパイラの動作と標準の曖昧さの概要
推奨事項
予期しない動作を避けるため、通常は推奨されませんstd::initializer_list を値で返します。可変数のオブジェクトを渡す必要がある場合は、代わりに std::vector などのコンテナ クラスの使用を検討してください。
以上が`std::initializer_list` 戻り値の有効期間が GCC と Clang で異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。