C++1z 範囲for文のためのbegin()とend()関数が、異なる型を返すことを許可

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