26

鉴于此 C++11 示例代码:

for ( const auto &foo : bar() )
{
    // ... do something with foo...
}

标准是否保证此示例中的表达式bar()只计算一次?

或者它最终会在循环的每次迭代中被调用吗?

4

1 回答 1

31

它只评估一次。该标准说基于范围的 for 循环等效于:

§6.5.4基于范围的 for 语句[stmt.ranged]

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

在您的情况下range-init等同( bar() )于(您指定的表达式,用括号括起来)。如您所见,该表达式仅评估一次。

于 2013-04-28T04:28:34.697 回答