【问题标题】:Is the expression in a ranged-for statement evaluated on each iteration? [duplicate]是否在每次迭代时评估 ranged-for 语句中的表达式? [复制]
【发布时间】:2014-01-15 13:52:36
【问题描述】:

当我这样做时:

for (auto p : foo()) {
   // ...
}

是否在循环的每次迭代中评估 foo()

【问题讨论】:

标签: c++ c++11


【解决方案1】:

不,只有一次。

[C++11: 6.5.4]: 对于基于范围的for 语句的形式

for ( for-range-declaration : expression ) statement

range-init等价于括号内的表达式

( expression )

[..] 基于范围的 for 语句等价于

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

[..]

有趣的是,这个相对较新的段落是使用预先存在的语言特征在代码方面定义语义的标准的罕见示例。我猜他们已经厌倦了编写简洁的技术语言。

这意味着我们必须从代码中推断上面的事实;在这种情况下,幸运的是,这很容易:range-init 被评估一次并绑定到通用引用 __range

【讨论】:

  • "pre-existing language features" 应该是 "other existing language features",因为 auto && 在该语言中之前不存在. +1,不过。
  • @Nawaz:嗯,很公平。我的意思是非远程-for,虽然;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多