auto
utilizza lo stesso meccanismo di deduzione del tipo dei modelli, l'unica eccezione di cui sono a conoscenza è quella delle liste di parentesi graffe, che vengono dedotte da auto
as std::initializer_list
, ma non dedotte in un contesto di modello.
auto x = expression;
funziona eliminando prima tutti i qualificatori di riferimento e cv dal tipo dell'espressione a destra, quindi facendo corrispondere il tipo. Per esempio, se avete const int& f(){...}
quindi auto x = f();
deduce x
come int
, e non const int&
.
L'altra forma,
auto& x = expression
non rimuove i qualificatori cv, quindi, usando l'esempio sopra, auto& x = f()
deduce x
come const int&
. Le altre combinazioni aggiungono semplicemente qualificatori cv.
Se vuoi che il tuo tipo sia sempre dedotto con qualificatori cv-ref, usa il famigerato decltype(auto)
C ++ 14, che usa le decltype
regole di deduzione del tipo.
Quindi, in poche parole, se vuoi copie, usa auto
, se vuoi riferimenti, usa auto&
. Usalo const
ogni volta che vuoi essere aggiuntivo const
.
EDIT
C'è un caso d'uso aggiuntivo,
auto&& x = expression;
che utilizza le regole di compressione dei riferimenti, come nel caso dell'inoltro dei riferimenti nel codice del modello. Se expression
è un lvalue, allora x
è un riferimento lvalue con i qualificatori cv di expression
. Se expression
è un rvalue, allora x
è un riferimento rvalue.
auto
funziona (tranne il caso particolare diinitializer_list
s, che sono non dedotto in un contesto di modello), quindiauto
digitare deduction.