The Standard is your friend, see [stmt.ranged]/1
For a range-based for statement of the form
for ( for-range-declaration : expression ) statementlet 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 ) statementlet range-init be equivalent to the braced-init-list. In each case, a range-based
forstatement 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.