Hay varias razones por las que no me gusta el auto para uso general:
- Puedes refactorizar el código sin modificarlo. Sí, esta es una de las cosas que a menudo se enumeran como un beneficio del uso del auto. Simplemente cambie el tipo de retorno de una función, y si todo el código que lo llama se usa automáticamente, ¡no se requiere ningún esfuerzo adicional! Presiona compilar, genera - 0 advertencias, 0 errores - y simplemente sigue adelante y verifica tu código sin tener que lidiar con el desorden de revisar y potencialmente modificar 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, al modificar 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. Soy un creyente en el concepto de "código de auto-documentación". El razonamiento detrás del código de autodocumentación es que los comentarios tienden a quedar desactualizados, ya no reflejan lo que el código está haciendo, mientras que el código en sí, 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 pasados. Sin embargo, si los tipos se pueden cambiar sin necesidad de modificar el propio código, entonces el código / las variables pueden volverse obsoletos. Por ejemplo:
auto bThreadOK = CheckThreadHealth ();
Excepto que el problema es que CheckThreadHealth () en algún punto fue refactorizado para devolver un valor de enumeración que indica el estado de error, en su caso, en lugar de un bool. Pero la persona que hizo ese cambio no pudo inspeccionar esta línea de código en particular, y el compilador no sirvió de nada porque se compiló sin advertencias ni errores.
- Nunca se puede saber cuáles son los tipos reales. Esto también suele aparecer como un "beneficio" primario del auto. ¿Por qué aprender lo que una función te está dando cuando puedes decir simplemente "A quién le importa? ¡Se compila!"
Incluso funciona un poco, probablemente. Digo que tipo de trabajo, porque aunque 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. Así que incluso sus pruebas de 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 otras 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 haga una suposición errónea acerca de qué es, logrando el mismo resultado que en 1a, pero desde el principio comenzando en lugar de post-refactor.
- Escribir el código cuando lo escribes inicialmente no es la parte más lenta de la programación. Sí, el auto hace que escribir un código más rápido inicialmente. Como descargo de responsabilidad, escribo > 100 WPM, así que tal vez no me moleste tanto como a los demás. Pero si todo lo que tenía que hacer era escribir un código nuevo todo el día, sería un campista feliz. La parte de la programación que más tiempo consume es diagnosticar errores en el código de casos difíciles de reproducir en el código, a menudo como resultado de problemas sutiles no obvios, como el tipo de uso excesivo de automóviles que probablemente se presente (referencia vs. copia, firmado vs. no firmado, flotante vs. int, bool vs. puntero, etc.).
Me parece obvio que auto se introdujo principalmente como una solución para la sintaxis terrible con los tipos de plantillas de biblioteca estándar. En lugar de intentar corregir la sintaxis de la plantilla con la que ya están familiarizados, 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 no es probable que las funciones de la biblioteca estándar cambien fundamentalmente en su propósito (o tipo de letra), haciendo 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 estar sujetos a cambios más fundamentales.
Otra aplicación útil de auto que mejora la capacidad del lenguaje es la creación de temporarios en macros de tipo agnóstico. Esto es algo que realmente no podías hacer antes, pero puedes hacerlo ahora.