16

範囲ベースの for ループで、ループの式ステートメントで使用するのと同じ名前のループ変数を宣言することは合法ですか? 例がそれを明確にすることを願っています。

#include <iostream>
#include <vector>

struct bar {
    std::vector<int> nums;
};

int main()
{
    bar b;
    b.nums = {1, 2, 3};

    for(int b : b.nums)
        std::cout << b << std::endl;   
}

gcc 4.8 ではエラーが発生しますが、clang 3.2 では許可されます。

4

3 に答える 3

9

Clang は正しいです。

C++11 標準のパラグラフ 6.5.4/1 では、範囲ベースのforステートメントを次のように定義しています。

フォームの範囲ベースの for ステートメントの場合

for ( for-range-declaration : expression ) statement

range -initを括弧で囲まれた式と同等にする

( expression )

およびフォームの範囲ベースの for ステートメントの場合

for ( for-range-declaration : braced-init-list ) statement

range-initを波括弧初期化リストと同等にします。いずれの場合も、範囲ベースの for ステートメントは次と同等です。

{
    auto && __range = range-init;
    for ( auto __begin = begin-expr,
          __end = end-expr;
          __begin != __end;
          ++__begin ) {
        for-range-declaration = *__begin;
        statement
    }
}

b上記から、に対応するvariablefor-range-declarationがネストされたブロックステートメント内で宣言されていることがわかりますが、初期化子range-init( に対応するb.nums) は親スコープに表示され、b型のオブジェクトに解決される必要がありますbar

于 2013-05-06T21:04:35.513 に答える