Это для (auto & a: a) грамматически правильно?

Например, я определил многомерный массив

array<array<array<int, 3>, 4>, 5> a;

И я петлю его

for (auto& a : a) 
    for (auto& a : a)
        for (auto& a : a) 
            a = 1;

Правильно ли это в грамматике? Я тестировал VS2015. Ошибок компиляции нет.

Ответ 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
   }
}

Ответ 2

Да, это:)

Причина в том, что a, который вы объявляете в цикле for, скрывает исходный массив a:

for (auto& a : a)
          ^^^   ^^^^^^^^^
          hides   this 'a' (the original array)

И затем, это снова и снова.