auto
utilise 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 auto
as 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 x
comme 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 x
comme 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 decltype
rè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 const
chaque 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 expression
est une lvalue, alors x
est une référence lvalue avec les qualificatifs cv de expression
. Si expression
est une rvalue, alors x
est une référence rvalue.
auto
fonctionne (sauf pour le cas particulier deinitializer_list
s, qui sont non déduit dans un contexte de modèle), puisauto
tapez déduction.