是(auto&a:a)语法正确吗?

use*_*020 12 c++ arrays for-loop

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

array<array<array<int, 3>, 4>, 5> a;
Run Code Online (Sandbox Code Playgroud)

我循环它

for (auto& a : a) 
    for (auto& a : a)
        for (auto& a : a) 
            a = 1;
Run Code Online (Sandbox Code Playgroud)

这是正确的语法吗?我在VS2015中测试过.没有编译错误.

Ben*_*igt 18

这是合法的,并且会按照您的期望进行,但重用变量名称仍然是一个非常糟糕的主意.

C++ 11 ranged-for被定义为源转换,它将范围变量的定义放在内部范围中,并对范围外的范围表达式执行求值.

第6.5.4节说明了这一点

基于范围的声明

for ( for-range-declaration : for-range-initializer ) statement
Run Code Online (Sandbox Code Playgroud)

相当于

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

  • @ user1899020看看这个例子:`for(auto&document:documents)for(auto&page:document)for(auto&char:page)char ='X';`.读到这个你可能知道这会做什么. (4认同)
  • @HolyBlackCat:它们是保留标识符,因此尝试以任何方式使用它们都会导致未定义的行为.只有编译器才能安全地使用它们.此外,标准的下一部分说"`__range`,`__begin`和`__end`是仅为展示定义的变量"然后继续描述`begin-expr`和`end-expr`. (3认同)

Rak*_*111 6

是的 :)

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

for (auto& a : a)
          ^^^   ^^^^^^^^^
          hides   this 'a' (the original array)
Run Code Online (Sandbox Code Playgroud)

然后,它又一次又一样.