鉴于此 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() )
于(您指定的表达式,用括号括起来)。如您所见,该表达式仅评估一次。