読者です 読者をやめる 読者になる 読者になる

<initializer_list>を暗黙にインクルード

C++

C++0xのRange-base for文を使用するには、std::Rangeコンセプトが必要なので<iterator_concepts>をインクルードする必要があります。

#include <iterator_concepts>

int array[5] = { 1, 2, 3, 4, 5 };
for (int& x : array) // <iterator_concepts>をインクルードしないとこのfor文は使えない
    x *= 2;

言語の構文なんだからせめて<iterator_concepts>は暗黙にインクルードしてほしい、とも思いますが
iterator_concepts>はもインクルードするのでかなり大きいライブラリを
Range-base for文を使用しない場合にもインクルードすることになり、コンパイル時間が長くなってしまいます。
これはC++のゼロオーバーヘッドルールに反することになるので、<iterator_concepts>は明示的にインクルードしないといけません。


ただし、Range-base for文にはinitializer_listも渡せることになっているので
以下の簡単なfor文を書くだけでも<iterator_concepts>と<initializer_list>の2つをインクルードする必要が出てきてしまいます。

#include <iterator_concepts> // for (int x : ...)
#include <initializer_list>  // {1, 2, 3}

for (int x : {1, 2, 3});

さすがにこれだけのために2つもインクルードするのはいかんだろ、ということで


「<initializer_list>は全ての翻訳単位で暗黙にインクルードされ、Core Languageの一部とする」


という仕様になるようです。
なので、{1, 2, 3}と書くのに<initializer_list>をインクルードする必要がなくなります。


それにともない、<initializer_list>で定義されていたstd::Rangeのコンセプトマップが<iterator_concepts>に移動されます。



N2872 Ensuring Certain C++0x Features "just work"