ホームページ >バックエンド開発 >C++ >C 関数から返される Braced-Init-List の有効期間はどれくらいですか?

C 関数から返される Braced-Init-List の有効期間はどれくらいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-29 18:29:22708ブラウズ

 What is the Lifetime of a Braced-Init-List Returned from a C   Function?

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 の現在の実装では配列の割り当てが途中で解除され、この期待に反します。

追加の説明

  • 括弧付き init-list を返すことはコピーを意味しません。返されたオブジェクトの構築。これは単に copy-list-initialization を使用して戻り値を初期化するだけです。
  • DR 1290 では、initializer_list の有効期間に関連する文言が改訂されており、DR 1565 および 1599 も検討中であり、さらなる変更がもたらされる可能性があります。
  • 追加の参照を initializer_list にバインドしても、その基礎となる配列の存続期間は延長されません。これは、一時オブジェクトへの参照が一時オブジェクトの存続期間を延長しないのと同様です。

以上がC 関数から返される Braced-Init-List の有効期間はどれくらいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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