对于(auto& a:a)在语法上是对的吗?

时间:2016-06-26 19:06:08

标签: c++ arrays for-loop

例如,我定义了一个多维数组

array<array<array<int, 3>, 4>, 5> a;

我循环了

for (auto& a : a) 
    for (auto& a : a)
        for (auto& a : a) 
            a = 1;

语法是否正确?我在VS2015中测试过。没有编译错误。

2 个答案:

答案 0 :(得分:18)

它是合法的,并且会按照您的意愿行事,但重用变量名称仍然是一个非常糟糕的主意。

C ++ 11 ranged-for被定义为源变换,它将范围变量的定义放在内部范围内,并执行范围外表达式的评估。

第6.5.4节说

  

基于范围的陈述

for ( for-range-declaration : for-range-initializer ) statement
     

相当于

{
   auto &&__range = for-range-initializer ;
   auto __begin = begin-expr ;
   auto __end = end-expr ;
   for ( ; __begin != __end; ++__begin ) {
      for-range-declaration = *__begin;
      statement
   }
}

答案 1 :(得分:6)

是的,它是:)

原因是因为你在for循环中声明的a隐藏了原始数组a

for (auto& a : a)
          ^^^   ^^^^^^^^^
          hides   this 'a' (the original array)

然后,它又一遍又一样。