autoutilizza 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 autoas 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 xcome 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 xcome 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 decltyperegole di deduzione del tipo.
Quindi, in poche parole, se vuoi copie, usa auto, se vuoi riferimenti, usa auto&. Usalo constogni 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.
autofunziona (tranne il caso particolare diinitializer_lists, che sono non dedotto in un contesto di modello), quindiautodigitare deduction.