The Standard is your friend, see **[stmt.ranged]**/1

For a range-based for statement of the form

`for ( for-range-declaration : expression ) statement`

let range-init be equivalent to the expression surrounded by parentheses

`( expression )`

and for a range-based for statement of the form

`for ( for-range-declaration : braced-init-list ) statement`

let range-init be equivalent to the braced-init-list. In each case, a range-based

`for`

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

So yes, the Standard guarantees that the best possible form is achieved.

And for a number of containers, such as `vector`

, it is undefined behavior to modify (insert/erase) them during this iteration.