質問:
C 標準によれば、関数初期化子リストを返します。基になる配列の有効期間は呼び出し関数まで延長されるべきですか?
C 標準では、std::initializer_list オブジェクトの有効期間は初期化するオブジェクトと同じであると規定されています。関数が初期化子リストを返すと、戻り値オブジェクトが初期化されます。ただし、初期化子リストには 2 つのインスタンスが関係しています。1 つは関数内、もう 1 つは呼び出しコード内です。
標準の例では、配列の有効期間がコピー先のオブジェクトまで延長されることを示唆しています。これは、戻り値の配列が呼び出し関数内でも存続する必要があることを意味します。ただし、これは実際には当てはまりません。
回答:
現在、std::initializer_list の戻り値の有効期間の動作は明確に定義されていません。 C規格。コンパイラによって実装方法が異なります。
結論として、現時点では std:: の有効期間に依存することはできません。 Initializer_list の戻り値が呼び出し元の関数に拡張されます。予期しない動作を引き起こす可能性があるため、値を渡すために std::initializer_list を使用しないでください。
追加メモ:
DR 1290 は標準の文言を変更し、 DR 1565 と 1599 はまだオープン中であり、関連する問題に対処しています。ただし、セマンティクスはまだ定義中であり、コンパイラーが最終的な変更を実装するには時間がかかります。
以上が`std::initializer_list` 戻り値の有効期間は呼び出し元の関数まで延長されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。