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。