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の以下の階層の下に解説ページを用意する予定です。