最終的なC++ 11標準には、<iterator>
または他のヘッダーを含めることなく、ネイティブ配列の「機能する」ための範囲ベースの規定が含まれています。これは最初に、作業用紙でn2900英国78と79の結果として扱われました。#include <initializer_list>範囲ベースの初期化リストを使用する必要がありますか?
この提案には、すべての翻訳単位で暗黙的に#include <initializer_list>
という規定も含まれています。プログラム
#include <iostream>
int main()
{
for (auto i : { 1, 2, 3, 4, 5 })
std::cout << i << "\n";
}
は、<initializer_list>
を含まなくても標準に準拠しています。
ただし、C++ 11からコンセプトが削除されたときには、n2930のように範囲ベースのものが修正されました。配列が「うまくいく」ための準備は残っていますが、イニシャライザのリストにも同じことが言及されていません。実際には様々な標準ライブラリコンテナヘッダが#include <initializer_list>
になり、8.5.4.2の最終的なテキストは私の反対であることを意味します。
私が知る限り、これはトピックの最終的な文言にかなり近いです。だから、上記のプログラムは、最終的な標準に関しては上手く成型されているのですか、それとも範囲ベースで使用するには#include <initializer_list>
する必要がありますか?別の言い方をすれば、範囲ベースのイニシャライザリストの使用は、FDISの8.5.4.2ごとに "std::initializer_list
の使用---タイプの名前が明示されていない暗黙的な使用"を構成するのでしょうか?
「はい」と確信しています。イニシャライザのリストではない場合、あなたのループは何を繰り返すでしょうか? –