Hay varias razones por las que no me gusta el auto para uso general:
- Puede refactorizar el código sin modificarlo. Sí, esta es una de las cosas que a menudo se enumeran como un beneficio del uso de automóviles. Simplemente cambie el tipo de retorno de una función, y si todo el código que lo llama usa auto, ¡no se requiere ningún esfuerzo adicional! Tocas la compilación, se construye (0 advertencias, 0 errores) y simplemente continúas e ingresas tu código sin tener que lidiar con el desorden de mirar y modificar potencialmente los 80 lugares donde se usa la función.
Pero espera, ¿es realmente una buena idea? ¿Qué pasa si el tipo importaba en media docena de esos casos de uso, y ahora ese código realmente se comporta de manera diferente? Esto también puede romper implícitamente la encapsulación, modificando no solo los valores de entrada, sino también el comportamiento de la implementación privada de otras clases que llaman a la función.
1a. Creo en el concepto de "código autodocumentado". El razonamiento detrás del código autodocumentado es que los comentarios tienden a estar desactualizados, ya no reflejan lo que está haciendo el código, mientras que el código en sí mismo, si se escribe de manera explícita, se explica por sí mismo, siempre se mantiene actualizado. en su intención, y no te dejará confundido con comentarios obsoletos. Sin embargo, si los tipos se pueden cambiar sin necesidad de modificar el código en sí, entonces el código / las variables en sí pueden volverse obsoletos. Por ejemplo:
auto bThreadOK = CheckThreadHealth ();
Excepto que el problema es que CheckThreadHealth () en algún momento fue refactorizado para devolver un valor de enumeración que indica el estado del error, si lo hay, en lugar de un bool. Pero la persona que realizó ese cambio no inspeccionó esta línea de código en particular, y el compilador no fue de ayuda porque compiló sin advertencias o errores.
- Es posible que nunca sepas cuáles son los tipos reales. Esto también suele figurar como un "beneficio" principal del automóvil. ¿Por qué aprender lo que te está dando una función, cuando puedes decir: "¿A quién le importa? ¡Se compila!"
Incluso funciona, probablemente. Digo que funciona, porque a pesar de que está haciendo una copia de una estructura de 500 bytes para cada iteración de bucle, por lo que puede inspeccionar un solo valor, el código sigue siendo completamente funcional. Entonces, incluso las pruebas de su unidad no lo ayudan a darse cuenta de que el código incorrecto se esconde detrás de ese auto simple e inocente. La mayoría de las personas que escanean el archivo tampoco lo notarán a primera vista.
Esto también puede empeorar si no sabe cuál es el tipo, pero elige un nombre de variable que hace una suposición errónea sobre lo que es, en realidad logra el mismo resultado que en 1a, pero desde el principio en lugar de post-refactor.
- Escribir el código cuando se escribe inicialmente no es la parte de programación que requiere más tiempo. Sí, auto hace que escribir código sea más rápido inicialmente. Como descargo de responsabilidad, escribo> 100 WPM, por lo que tal vez no me moleste tanto como a los demás. Pero si todo lo que tuviera que hacer fuera escribir un código nuevo todo el día, sería un campista feliz. La parte de la programación que consume más tiempo es diagnosticar errores de borde de borde difíciles de reproducir en el código, que a menudo resultan de problemas sutiles y no obvios, como el uso excesivo de auto (referencia frente a copia, con y sin signo, flotante con int, bool con puntero, etc.).
Me parece obvio que auto se introdujo principalmente como una solución alternativa para una sintaxis terrible con tipos de plantillas de biblioteca estándar. En lugar de tratar de corregir la sintaxis de la plantilla con la que las personas ya están familiarizadas, lo que también puede ser casi imposible de hacer debido a todo el código existente que podría romper, agregue una palabra clave que básicamente oculte el problema. Esencialmente, lo que podríamos llamar un "hack".
En realidad no tengo ningún desacuerdo con el uso de auto con contenedores de biblioteca estándar. Obviamente es para lo que se creó la palabra clave, y es probable que las funciones en la biblioteca estándar no cambien fundamentalmente su propósito (o tipo para el caso), lo que hace que el auto sea relativamente seguro de usar. Pero sería muy cauteloso al usarlo con su propio código e interfaces que pueden ser mucho más volátiles y potencialmente sujetos a cambios más fundamentales.
Otra aplicación útil de auto que mejora la capacidad del lenguaje es crear temporarios en macros independientes de tipo. Esto es algo que realmente no podías hacer antes, pero puedes hacerlo ahora.
auto
a menudo hace que las cosas sean más difíciles de leer cuando ya son difíciles de leer, es decir, funciones demasiado largas, variables mal nombradas, etc.