This question already has an answer here:
Does a C++11 range-based for loop condition get evaluated every cycle?

(1个答案)


7年前关闭。




给出以下C++ 11示例代码:
for ( const auto &foo : bar() )
{
    // ... do something with foo...
}

是否通过标准保证使得本示例中的bar()表达式仅被评估一次?

还是最终可能在循环的每次迭代中被调用?

最佳答案

仅评估一次。该标准说基于范围的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() )(您指定的表达式,用括号括起来)。如您所见,该表达式仅被评估一次。

关于c++ - C++ 11基于范围的for()循环评估一次还是多次? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16259574/

10-10 08:04