C++11 range-based for() loops evaluate once or multiple times?

c++, c++11, for-loop, foreach

Solution

It is evaluated only once. The standard says that the range-based for loop is equivalent to this:

§6.5.4 The range-based for statement [stmt.ranged]

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

with `range-init` being equivalent to `( bar() )` in your case (the expression you specify, surrounded by parenthesis). That expression is only evaluated once as you can see.

Problem

Given this C++11 example code: ``` for ( const auto &foo : bar() ) { // ... do something with foo... } ``` Is it guaranteed by the standard that the expression `bar()` in this example is evaluated only once? Or could it end up being called at every iteration of the loop?

Original source

Related problems