2012-01-18 9 views
10

最終的な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の使用---タイプの名前が明示されていない暗黙的な使用"を構成するのでしょうか?

+2

「はい」と確信しています。イニシャライザのリストではない場合、あなたのループは何を繰り返すでしょうか? –

答えて

6

私は「はい」と言います。 §6.5.4[stmt.ranged]/1によれば、ステートメント

for (auto i : { 1, 2, 3, 4, 5 }) 
    ... 

auto&& __range = { 1, 2, 3, 4, 5 }; 
... 

にちょうど相当し、それは、initializer_list<int>が使用されている意味し、<initializer_list>ヘッダが含まれることが必要。

+0

それは私の疑惑でしたが、どういうわけか直感的ではないようです。どのようにC++ 03のためにすべての教科書は 'std :: endl'を使用しますが、' iphoneip'ではなく ''しか含んでいません。 –

関連する問題