c++ - reglas - Es para(auto y a: a) gramaticalmente cierto?
reglas gramaticales pdf (2)
Por ejemplo, definí una matriz multidimensional
array<array<array<int, 3>, 4>, 5> a;
Y lo bucleo
for (auto& a : a)
for (auto& a : a)
for (auto& a : a)
a = 1;
¿Es eso correcto en gramática? Probé en VS2015. Sin errores de compilación.
Es legal y hará lo que esperas, pero sigue siendo una mala idea reutilizar los nombres variables.
El C ++ 11 ranged-for se define como una transformación de origen, que coloca la definición de la variable de rango en un ámbito interno y realiza la evaluación de la expresión de rango fuera de ese alcance.
La Sección 6.5.4 dice que
La declaración basada en rango
for ( for-range-declaration : for-range-initializer ) statement
es equivalente a
{ auto &&__range = for-range-initializer ; auto __begin = begin-expr ; auto __end = end-expr ; for ( ; __begin != __end; ++__begin ) { for-range-declaration = *__begin; statement } }
Sí lo es :)
La razón es porque el a
que declaras en el bucle for oculta la matriz original a
:
for (auto& a : a)
^^^ ^^^^^^^^^
hides this ''a'' (the original array)
Y luego, es lo mismo una vez más.