基于范围标识符与表达和声明同名(Identifier with the same name in b

2019-09-02 02:51发布

它是合法的基于不等,与我在循环的表达式语句使用相同的名称环路声明循环变量? 我希望的例子清楚。

#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给出了一个错误而铛3.2允许它。

Answer 1:

从我读的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;
   }
}

这对我来说意味着是正确的。



Answer 2:

锵是正确的

段落6.5.4 C ++ 11标准的/ 1定义了基于范围的for声明如下:

对于基于范围为形式的声明

 for ( for-range-declaration : expression ) statement 

范围-INIT相当于用括号包围的表达

 ( expression ) 

而对于基于范围为形式的声明

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

范围-INIT等同于支撑-初始化列表。 在每一种情况下,范围为基础的语句相当于

 { 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



Answer 3:

对于它的价值,这个错误现在已经固定在后备箱的gcc。 :)



文章来源: Identifier with the same name in both expression and declaration of range-based for