在基于范围的表达式和声明中使用相同名称的标识符

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (61)

在基于范围的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给出一个错误,而clang3.2允许错误。

提问于
用户回答回答于

从我对C++2011 6.5.4的阅读中,你的代码:

bar b;

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

应改为:

bar b;

{
   auto && __range = b.nums;
   for (auto __begin = __range.begin(), __end = __range.end(); __begin != __end; ++__begin ) {
       int b = *__begin;
       std::cout << b << std::endl;
   }
}
用户回答回答于

C ++ 11标准第6.5.4 / 1段规定了基于范围的for说明如下:

对于基于范围的表单声明 for ( for-range-declaration : expression ) statement range-init等于用括号括起来的表达式 ( expression ) 并为范围为表单的声明 for ( for-range-declaration : braced-init-list ) statement range-init等同于braced-init-list。在每种情况下,基于范围的陈述相当于 { auto && __range = range-init; for ( auto __begin = begin-expr, __end = end-expr; __begin != __end; ++__begin ) { for-range-declaration = *__begin; statement } }

从上面可以看出b,对应于该变量的变量for-range-declaration在嵌套块语句中声明,而初始值设定项range-init(对应于b.nums)出现在父范围内,其中b应解析为类型对象bar

扫码关注云+社区

领取腾讯云代金券