С++ 11 для циклов for() оценивается один или несколько раз?

Учитывая этот пример кода С++ 11:

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

Является ли гарантированным стандартом, что выражение bar() в этом примере оценивается только один раз?

Или это может быть вызвано на каждой итерации цикла?

Ответ 1

Он оценивается только один раз. В стандарте говорится, что цикл, основанный на диапазоне, эквивалентен этому:

§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
  }
}

с range-init эквивалентно ( bar() ) в вашем случае (указанное вами выражение, окруженное скобками). Это выражение оценивается только один раз, как вы можете видеть.