autoutilise le même mécanisme de déduction de type que les modèles, la seule exception que je sache étant celle des listes brace-init, qui sont déduites par autoas std::initializer_list, mais non déduites dans un contexte de modèle.
auto x = expression;
fonctionne en supprimant d'abord tous les qualificatifs de référence et cv du type de l'expression de droite, puis en faisant correspondre le type. Par exemple, si vous avez const int& f(){...}alors auto x = f();déduit xcomme int, et non const int& .
L'autre forme,
auto& x = expression
ne supprime pas les qualificatifs cv, donc, en utilisant l'exemple ci-dessus, auto& x = f()déduit xcomme const int&. Les autres combinaisons ajoutent simplement des qualificatifs cv.
Si vous voulez que votre type soit toujours déduit avec des qualificatifs cv-ref, utilisez le tristement célèbre decltype(auto)en C ++ 14, qui utilise les decltyperègles de déduction de type.
Donc, en un mot, si vous voulez des copies, utilisez auto, si vous voulez des références, utilisez auto&. À utiliser constchaque fois que vous voulez une const-ness supplémentaire .
EDIT
Il existe un cas d'utilisation supplémentaire,
auto&& x = expression;
qui utilise les règles de réduction des références, comme dans le cas de la transmission des références dans le code du modèle. Si expressionest une lvalue, alors xest une référence lvalue avec les qualificatifs cv de expression. Si expressionest une rvalue, alors xest une référence rvalue.
autofonctionne (sauf pour le cas particulier deinitializer_lists, qui sont non déduit dans un contexte de modèle), puisautotapez déduction.