Braced-Init-List 戻り値のライフタイム
C では、関数から braced-init-list を返すと、次のような疑問が生じます。 initializer_list とその基礎となる配列の有効期間。
問題の概要
以前の分析では、GCC が return 式の終了前に、initializer_list 配列を誤って終了していることが示唆されていますが、Clang では
標準解釈
C 11 標準によれば、中括弧付き init-list を含む return ステートメントは戻り値を初期化します。コピーリストの初期化。戻り値の型が std::initializer_list の特殊化である場合、initializer_list オブジェクトが構築され、指定されたリストから初期化されます。
Array Lifetime
構築されたInitializer_list には、初期化子リストから初期化された要素の配列への参照。配列の有効期間は、initializer_list オブジェクトと同じになるように定義されます。これは、return ステートメントで、基になる配列が braced-init-list から初期化され、有効期間が呼び出しスコープまで延長されることを意味します。
正しい実装
したがって、期待される動作は、initializer_list の配列が呼び出し元の関数に永続化され、その後の使用または名前付き参照へのバインドが可能になることです。ただし、GCC の現在の実装では配列の割り当てが途中で解除され、この期待に反します。
追加の説明
以上がC 関数から返される Braced-Init-List の有効期間はどれくらいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。