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
。