它是合法的基于不等,与我在循环的表达式语句使用相同的名称环路声明循环变量? 我希望的例子清楚。
#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允许它。
从我读的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;
}
}
这对我来说意味着铛是正确的。
锵是正确的 。
段落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
。
对于它的价值,这个错误现在已经固定在后备箱的gcc。 :)
文章来源: Identifier with the same name in both expression and declaration of range-based for