autoutiliza 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 autocomo 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 xcomo inty 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 xcomo 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 decltypereglas de deducción de tipos.
Entonces, en pocas palabras, si desea copias, use auto, si desea referencias, use auto&. Úselo constsiempre 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 expressiones un lvalue, entonces xes una referencia de lvalue con los calificadores cv de expression. Si expressiones un rvalue, entonces xes una referencia de rvalue.
autofunciona (excepto en el caso peculiar deinitializer_lists, que son no deducido en un contexto de plantilla), luegoautoescriba deducción.