是否在每次迭代中计算了ranged-for语句中的表达式?

时间:2014-01-15 13:52:36

标签: c++ c++11

当我这样做时:

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

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

1 个答案:

答案 0 :(得分:4)

不,只有一次。

  

[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