auto
utilizza lo stesso meccanismo di tipo detrazione come modelli, l'unica eccezione che io sono consapevole di essere quella di liste brace-init, che si deducono dalla auto
come std::initializer_list
, ma non dedotta in un contesto modello.
auto x = expression;
opere prima strippaggio tutte qualificatori riferimento e cv dal tipo dell'espressione destra, quindi corrispondenti al tipo. Ad esempio, se si dispone di const int& f(){...}
, auto x = f();
deduce x
come int
e nonconst int&
.
L'altra forma,
auto& x = expression
non elimina CV-qualificazioni, quindi, usando l'esempio precedente, auto& x = f()
deduce x
come const int&
. Le altre combinazioni aggiungono solo qualificatori di cv.
Se si desidera che il proprio tipo venga sempre dedotto con qualificazioni cv-ref, utilizzare il famigerato decltype(auto)
in C++ 14, che utilizza le regole di deduzione del tipo decltype
.
Quindi, in poche parole, se si desidera copiare, utilizzare auto
, se si desidera riferimenti, utilizzare auto&
. Utilizzare const
ogni volta che si desidera ulteriore const
-ness.
EDIT V'è un caso d'uso aggiuntivo,
auto&& x = expression;
che utilizza le regole di riferimento-collasso, proprio come nel caso di riferimenti di inoltro nel codice del modello. Se expression
è un lvalue, allora x
è un riferimento lvalue con i qualificatori cv di expression
. Se expression
è un valore rvalore, allora x
è un riferimento di rvalue.
Consiglio vivamente di leggere questo: https://www.safaribooksonline.com/library/view/effective-modern-c/9781491908419/ch01.html I primi due capitoli sono gratuiti e descrivono la deduzione del tipo di modello, che è essenzialmente come funziona 'auto' (tranne il caso particolare di' initializer_list's, che non è dedotto in un contesto di template), quindi la deduzione di tipo 'auto'. – vsoftco