auto
usa 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 auto
como 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();
x
int
const int&
A outra forma,
auto& x = expression
não remove os qualificadores cv, portanto, usando o exemplo acima, auto& x = f()
deduz x
como 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 decltype
regras de dedução de tipo.
Então, em poucas palavras, se você quiser cópias, use auto
, se quiser referências, use auto&
. Use const
sempre 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 expression
for um lvalue, então x
é uma referência lvalue com os qualificadores cv de expression
. Se expression
for um rvalue, então x
é uma referência rvalue.
auto
funciona (exceto para o caso peculiar deinitializer_list
s, que são não deduzido em um contexto de modelo) eauto
digite dedução.