Menu

Palabra clave auto en C++: deducción de tipos con ejemplos

Cómo la palabra clave auto deja que el compilador deduzca el tipo de una variable por ti: qué descarta, dónde brilla y las trampas que pillan a los principiantes.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

Deja que el compilador elija el tipo

En la página anterior viste que toda variable de C++ tiene un tipo fijo: int, double, std::string, etc. Escribir ese tipo a mano está bien para int count = 0;, pero se vuelve ruidoso cuando los tipos crecen. La palabra clave auto (C++11 y posteriores) permite que el compilador deduzca el tipo a partir del valor que asignas, así escribes el valor una vez y dejas que el compilador rellene el resto.

La idea clave: auto no es tipado dinámico. Cada variable sigue teniendo un único tipo concreto, fijado en tiempo de compilación. auto solo te ahorra escribirlo.

Por qué auto vale la pena

Para tipos cortos y evidentes, auto count = 0; e int count = 0; se leen igual de bien. Donde auto realmente compensa es con nombres de tipos largos y repetitivos, los que aparecen con los contenedores e iteradores de la biblioteca estándar.

Compara la versión larga con la versión con auto:

// Sin auto: en la práctica el tipo se escribe dos veces
std::vector<std::pair<std::string, int>>::iterator it = scores.begin();

// Con auto: el compilador ya conoce el tipo
auto it = scores.begin();

Ambas declaran exactamente el mismo tipo de iterador. La segunda es más fácil de leer y no quedará desincronizada si más adelante cambias scores por otro contenedor.

Aquí está dentro de un programa completo:

auto en bucles for basados en rango

El lugar más habitual donde te encontrarás con auto es el bucle for basado en rango. Casi nunca querrás escribir a mano el tipo del elemento, y la forma en que escribas el auto decide si obtienes una copia o una referencia.

Tres variantes que verás, y lo que significa cada una:

  • for (auto x : v) - x es una copia de cada elemento. Barato para int, derrochador para objetos grandes.
  • for (auto& x : v) - x es una referencia; puedes modificar los elementos en el sitio.
  • for (const auto& x : v) - x es una referencia de solo lectura. Úsala cuando solo necesites leer.

Este siguiente programa modifica el contenedor a través de auto&:

Trampa: si escribes for (auto n : nums) (sin &) en ese bucle, n *= 10 cambiaría silenciosamente solo la copia, dejando nums intacto. El compilador no te avisará: el bucle simplemente no hace nada útil.

Qué descarta auto

Un auto simple deduce el tipo igual que lo hace un parámetro de función por valor: descarta el const de nivel superior, las referencias y volatile. Eso significa que auto siempre te da una copia nueva y modificable, salvo que pidas otra cosa.

Si quieres conservar el const o evitar la copia, añades los calificadores tú mismo. El patrón es decorar auto igual que decorarías cualquier tipo:

Así que auto deduce el tipo base; &, const y * son perillas que añades encima. auto es el tipo, const auto& es una referencia de solo lectura a él.

Errores comunes y trampas

auto elimina el esfuerzo de escribir, no la necesidad de entender los tipos. Hay algunas trampas que pillan a los principiantes:

Tienes que inicializar. auto no tiene nada de lo que deducir en una declaración vacía, así que esto es un error de compilación irremediable:

auto x;        // error: declaration of 'auto x' has no initializer
auto y = 0;    // correcto

Los literales enteros son int, no double. auto half = 1 / 2; deduce int y almacena 0, porque 1 / 2 es división entera antes de que auto lo vea siquiera. El tipo sigue al valor:

auto descarta la referencia: cuidado con las sorpresas de copia colgante. Si una función devuelve una referencia y la capturas con un auto simple, obtienes una copia, lo que a veces es un auténtico problema de rendimiento en un bucle intensivo (una copia profunda de un objeto grande en cada iteración). Recurre a const auto& cuando quieras decir "mirar, no llevar".

No ocultes el tipo cuando importa. auto result = compute(); está bien cuando el tipo de retorno de compute es evidente por el contexto, pero si quien lee tiene que ir a buscar qué es realmente result, escribir el tipo puede ser la opción más amable. auto sirve para reducir ruido, no para ocultar la intención.

Siguiente: Constantes y const

Ya has visto que auto descarta deliberadamente const salvo que pidas conservarlo, lo que plantea la pregunta evidente: ¿qué garantiza realmente const y cuándo deberías marcar un valor como inmutable en primer lugar? La siguiente página profundiza en const, las expresiones constantes y por qué "hazlo const por defecto" es uno de los hábitos más útiles en C++.

Preguntas frecuentes

¿Qué hace la palabra clave auto en C++?

auto le indica al compilador que deduzca el tipo de la variable a partir de su inicializador. auto x = 5; hace que x sea un int; auto y = 3.14; hace que y sea un double. El tipo queda fijado en tiempo de compilación: auto no es tipado dinámico, es un atajo para no escribir el tipo tú mismo.

¿auto conserva const y las referencias en C++?

No. Un auto simple descarta el const de nivel superior, las referencias y volatile. Si el origen es const int& r, entonces auto x = r; produce una copia int simple. Para conservarlos debes indicarlo explícitamente: usa const auto& para vincular una referencia de solo lectura sin copiar.

¿Se puede declarar una variable con auto sin inicializarla?

No. auto x; es un error de compilación porque no hay inicializador del que el compilador pueda deducir un tipo. Toda variable auto debe recibir un valor en el punto de su declaración.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR