autousa o mesmo mecanismo de dedução de tipo como modelos, a única exceção de que estou ciente é a das listas brace-init, que são deduzidas por autocomo std::initializer_list, mas não deduzidas em um contexto de modelo.
auto x = expression;
funciona removendo primeiro todos os qualificadores de referência e cv do tipo da expressão do lado direito e, em seguida, combinando o tipo. Por exemplo, se você deduz const int& f(){...}então como e não .auto x = f();xint const int&
A outra forma,
auto& x = expression
não remove os qualificadores cv, portanto, usando o exemplo acima, auto& x = f()deduz xcomo const int&. As outras combinações apenas adicionam os qualificadores CV.
Se você quiser que seu tipo seja sempre deduzido com os qualificadores cv-ref, use o infame decltype(auto)em C ++ 14, que usa as decltyperegras de dedução de tipo.
Então, em poucas palavras, se você quiser cópias, use auto, se quiser referências, use auto&. Use constsempre que desejar const-ness adicional .
EDITAR
Há um caso de uso adicional,
auto&& x = expression;
que usa as regras de recolhimento de referência, o mesmo que no caso de referências de encaminhamento no código do modelo. Se expressionfor um lvalue, então xé uma referência lvalue com os qualificadores cv de expression. Se expressionfor um rvalue, então xé uma referência rvalue.
autofunciona (exceto para o caso peculiar deinitializer_lists, que são não deduzido em um contexto de modelo) eautodigite dedução.