質問: GCC の実装により、std::initializer_list が破棄されるというのは正しいですか? std::initializer_list 配列は、戻り完全式の最後にある関数から返されますか?
答え: いいえ、これは正しくありません。
C 11 標準に従って、braced-init-list を含む return ステートメントは、指定された初期化子リストから copy-list-initialization によって返されるオブジェクトまたは参照を初期化します。初期化子リストを使用して initializer_list オブジェクトを作成すると、リストの要素を格納するために配列が割り当てられます。配列の有効期間は次のように定義されます。
配列の有効期間は、initializer_list オブジェクトの有効期間と同じです。
提供された例では、initializer_list オブジェクトは戻り値として作成されます。 send() 関数からの値。 3 つの noisydt オブジェクトで初期化され、receive() 関数に返されます。 initializer_list オブジェクトに関連付けられた配列の有効期間は、receive() 関数まで拡張され、リストの要素にアクセスして使用できるようにする必要があります。
ただし、GCC 実装は、戻り値の前に誤って配列を破棄します。を使用すると、未定義の動作が発生します。正しい動作は、配列が accept() 関数の終了まで存続することです。 Clang と ICC はどちらも正しい動作を示しています。
GCC 実装による std::initializer_list 戻り値の処理は、C 11 標準に従っていません。 Clang と ICC は正しい実装を提供しており、std::initializer_lists を使用する場合はこれらのコンパイラを使用することをお勧めします。
以上がGCC は、関数から返された `std::initializer_list` 配列を、戻りの完全表現が終了する前に破棄しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。