Ответ 1
Он оценивается только один раз. Стандарт определяет оператор на основе диапазона for
как эквивалент:
{
auto && __range = range-init;
for ( auto __begin = begin-expr, __end = end-expr; __begin != __end; ++__begin ) {
for-range-declaration = *__begin;
statement
}
}
где range-init
- это выражение (окруженное скобками) или бит-init-list после :