【问题标题】:Is for (auto& a : a) grammatically right?是 for (auto& a : a) 语法正确吗?
【发布时间】:2016-10-28 18:32:01
【问题描述】:

比如我定义了一个多维数组

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

然后我循环播放它

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

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

【问题讨论】:

  • @Resurrection:它无法编译,因为a 的声明中的&lt;&gt; 不匹配。修复后,它应该可以编译,因为这是合法的(例如 clang 接受它)。
  • @BenVoigt 我注意到并更正了它,但它仍然无法在 VS2015 中编译并出现重新定义错误。编辑:好的,没关系,我在那里有另一个名为“a”的变量。好吧,这令人困惑!

标签: c++ arrays for-loop


【解决方案1】:

这是合法的,并且会如你所愿,但重用变量名仍然是一个非常糟糕的主意。

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

第 6.5.4 节说

基于范围的 for 语句

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
   }
}

【讨论】:

  • 所以我需要几个临时名称,也不可读。有更好的方法吗?
  • 如果您选择了好名字,它将是可读的。不是我的错,你懒得输入多字符变量名。
  • @HolyBlackCat:它们是保留的标识符,因此尝试以任何方式使用它们会导致未定义的行为。只有编译器才能安全地使用它们。此外,标准的下一部分说“__range__begin__end 是仅为说明而定义的变量”,然后继续描述 begin-exprend-expr
  • @user1899020 看看这个例子:for(auto&amp; document : documents) for(auto&amp; page: document) for(auto&amp; char: page) char = 'X';。阅读本文,您可能知道它会做什么。
  • @sehe:这是C++,语法和语义密不可分
【解决方案2】:

是的,它是:)

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

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

然后,一切又是一样的。

【讨论】:

    猜你喜欢
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 2011-10-24
    相关资源
    最近更新 更多