auto
utiliza el mismo mecanismo de deducción de tipos que las plantillas, la única excepción que conozco es la de las listas brace-init, que se deducen auto
como std::initializer_list
, pero no se deducen en un contexto de plantilla.
auto x = expression;
funciona quitando primero todos los calificadores de referencia y cv del tipo de la expresión del lado derecho, luego haciendo coincidir el tipo. Por ejemplo, si tiene const int& f(){...}
, auto x = f();
deduce x
como int
y no const int&
.
La otra forma,
auto& x = expression
no elimina los calificadores cv, por lo que, utilizando el ejemplo anterior, auto& x = f()
deduce x
como const int&
. Las otras combinaciones solo agregan calificadores de cv.
Si desea que su tipo siempre se deduzca con calificadores cv-ref, use el infame decltype(auto)
en C ++ 14, que usa las decltype
reglas de deducción de tipos.
Entonces, en pocas palabras, si desea copias, use auto
, si desea referencias, use auto&
. Úselo const
siempre que lo desee const
.
EDITAR
Hay un caso de uso adicional,
auto&& x = expression;
que utiliza las reglas de contracción de referencias, al igual que en el caso de reenviar referencias en el código de plantilla. Si expression
es un lvalue, entonces x
es una referencia de lvalue con los calificadores cv de expression
. Si expression
es un rvalue, entonces x
es una referencia de rvalue.
auto
funciona (excepto en el caso peculiar deinitializer_list
s, que son no deducido en un contexto de plantilla), luegoauto
escriba deducción.