ホームページ  >  記事  >  バックエンド開発  >  返された `std::initializer_list` 配列の GCC の破壊は正しいですか?

返された `std::initializer_list` 配列の GCC の破壊は正しいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-01 17:08:02328ブラウズ

Is GCC's Destruction of a Returned `std::initializer_list` Array Correct?

返された std::initializer_list 配列の有効期間

関数から返された std::initializer_list 配列の有効期間は、異なるコンパイラでの動作。 GCC による return 完全式の最後での配列の破棄が正しいかどうかという疑問が生じます。

標準の分析

C 11 §6.6 による。 3/2 では、中括弧付き init-list を含む return ステートメントにより、返されたオブジェクトまたは参照が初期化子リストからコピー リスト初期化されます。このプロセスは、一時的な初期化子リスト オブジェクトとその基礎となる配列ストレージを初期化子リストから初期化し、別の初期化子リストが最初から初期化されます。

8.5.4/6 で定義されている配列の有効期間は、 initializer_list オブジェクトの有効期間。これは、initializer_list オブジェクトと配列が braced-init-list で初期化された std::vector の完全な式の有効期間を持つ例から理解できます。

Braced-Init の戻り値-List

中括弧で囲まれたベアリストが返される場合、copy-list-initialization が使用されます。これは、コピーを含まない構文 nocopy X = { 3 } に似ており、配列の有効期間が延長される 8.5.4/6 の例と同じです。

GCC の問題と Clang

ただし、GCC と Clang の間では実装に矛盾があります。 GCC は返す前に配列を破棄しますが、Clang は名前付きのInitializer_list を保持しますが、リスト内のオブジェクトを破棄することはありません。

推奨

std:: の使用を避けることをお勧めします。 Initializer_list を使用して、値が永続化されることを期待して値を渡します。標準実装とコンパイラ実装に不確実性があるため、オブジェクトの有効期間を維持する信頼性が低くなります。

以上が返された `std::initializer_list` 配列の GCC の破壊は正しいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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