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"