C++ 11基于范围的()循环评估一次或多次?

Sté*_*ane 21 c++ foreach for-loop c++11

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

for ( const auto &foo : bar() )
{
    // ... do something with foo...
}
Run Code Online (Sandbox Code Playgroud)

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

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

Mat*_*Mat 26

它只评估一次.标准说基于范围的for循环等价于:

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

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

range-init等同于( bar() )你的情况(您指定的表达,用括号包围).如您所见,该表达式仅进行一次评估.