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