ホームページ  >  記事  >  バックエンド開発  >  `std::initializer_list` 戻り値の有効期間は呼び出し元の関数まで延長されますか?

`std::initializer_list` 戻り値の有効期間は呼び出し元の関数まで延長されますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-28 22:44:02997ブラウズ

Does the Lifetime of a `std::initializer_list` Return Value Extend into the Calling Function?

std::initializer_list 戻り値のライフタイム

質問:

C 標準によれば、関数初期化子リストを返します。基になる配列の有効期間は呼び出し関数まで延長されるべきですか?

分析

C 標準では、std::initializer_list オブジェクトの有効期間は初期化するオブジェクトと同じであると規定されています。関数が初期化子リストを返すと、戻り値オブジェクトが初期化されます。ただし、初期化子リストには 2 つのインスタンスが関係しています。1 つは関数内、もう 1 つは呼び出しコード内です。

標準の例では、配列の有効期間がコピー先のオブジェクトまで延長されることを示唆しています。これは、戻り値の配列が呼び出し関数内でも存続する必要があることを意味します。ただし、これは実際には当てはまりません。

回答:

現在、std::initializer_list の戻り値の有効期間の動作は明確に定義されていません。 C規格。コンパイラによって実装方法が異なります。

  • GCC は名前付き初期化子リストを保持しながら、返す前に配列を誤って破棄します。
  • Clang は標準の例を正しく処理しますが、オブジェクトを破棄することはありません。リスト。これはメモリ リークにつながる可能性があります。
  • ICC はイニシャライザ リストをまったくサポートしません。

結論として、現時点では std:: の有効期間に依存することはできません。 Initializer_list の戻り値が呼び出し元の関数に拡張されます。予期しない動作を引き起こす可能性があるため、値を渡すために std::initializer_list を使用しないでください。

追加メモ:

DR 1290 は標準の文言を変更し、 DR 1565 と 1599 はまだオープン中であり、関連する問題に対処しています。ただし、セマンティクスはまだ定義中であり、コンパイラーが最終的な変更を実装するには時間がかかります。

以上が`std::initializer_list` 戻り値の有効期間は呼び出し元の関数まで延長されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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