C++11時点での範囲for文は、begin()関数とend()関数が同じ型のイテレータオブジェクトを返すことを要求していました。
しかし、end()の方のイテレータは特殊な型にしたいことがたまにあります。ストリームイテレータを作ろうとするときとかもそうだと思いますが、「終端」という意味だけを持たせるなら、終端以外の情報を終端イテレータに持たせる必要がないので、別の型にしたかったりします。
そのような状況のために、C++1zからは、begin()とend()が異なる型のイテレータオブジェクトを返すことが許可されます。
C++11まで以下のようになっていた範囲for文の効果は、
{
auto && __range = for-range-initializer;
for ( auto __begin = begin-expr,
__end = end-expr;
__begin != __end;
++__begin ) {
for-range-declaration = *__begin;
statement
}
}
C++1zでは以下のようになります:
{
auto && __range = for-range-initializer;
auto __begin = begin-expr;
auto __end = end-expr;
for ( ; __begin != __end; ++__begin ) {
for-range-declaration = *__begin;
statement
}
}
参照
お断り
この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。