Sí. auto
es preferido. Porque si cambia la declaración de v
de:
std::vector<int> v; //before
a esto:
std::vector<float> v; //after
Si utiliza int &
en el for
, entonces usted tiene que cambiar eso también. ¡Pero con auto
, no hay necesidad de cambiar!
En mi opinión, trabajar con auto
es más o menos como programming to interface. Así que si usted hace una operación +=
en el circuito, y realmente no importa el tipo de la variable de bucle e
siempre y cuando el tipo de operación es compatible con +=
, a continuación, auto
es la solución:
for(auto & e : v)
{
e += 2;
}
En este Por ejemplo, todo lo que le importa es que el tipo de e
es compatible con +=
con int
en el lado derecho. Funcionará incluso para los tipos definidos por el usuario, que ha definido operator+=(int)
, o operator+=(T)
donde T
es un tipo que admite la conversión implícita de int
.Es como si usted está programando para la interfaz:
std::vector<Animal*> animals;
animals.push_back(new Dog());
animals.push_back(new Cat());
animals.push_back(new Horse());
for(size_t i = 0 ; i < animals.size(); ++i)
{
animals[i]->eat(food); //program to interface
}
Por supuesto, le gustaría escribir este bucle como:
for(Animal * animal : animals)
{
animal->eat(food); //still program to interface
}
O simplemente esto:
for(auto animal : animals)
{
animal->eat(food); //still program to interface
}
que es todavía programming to interface.
Pero al mismo tiempo, vale la pena señalar el punto en el comentario de @ David.
Esto se puede leer de ambas formas, podría ser mejor obtener un error de compilación diciendo que 'int &' no se puede establecer desde 'float &' que el compilador que acepta silenciosamente el código que debía funcionar con ints ... No diciendo que es una mejor idea tener 'int &', todo depende de lo que hagas en el cuerpo del ciclo 'for', si no depende del tipo exacto' auto' será mejor –
@ DavidRodríguez-dribeas : Creo que lo que dijiste es un escenario muy inusual. Por lo general, tenemos que cambiar 'int' por' flotar', en cuyo caso 'auto' es una mejor solución. – Nawaz
De acuerdo. En la mayoría de los casos 'auto y' funcionará ... pero todavía no me siento cómodo con los tipos que no son explícitos en todas partes :) (¡excepto cuando realmente no quiero saber!) –