La parola chiave auto in C++ (a partire da C++11) consente al compilatore di dedurre automaticamente il tipo di una variabile dall'espressione di inizializzazione. Questo semplifica il lavoro con tipi lunghi (ad esempio, quando si lavora con iteratori, lambda, espressioni template) e migliora la leggibilità del codice.
Esempio di utilizzo:
auto i = 42; // int auto d = 3.14; // double auto s = std::string("hi"); auto it = v.begin(); // iteratore
Tuttavia, auto deduce il tipo esattamente in base a ciò che gli viene "fornito". Ad esempio, se si restituisce per valore, auto darà un valore, mentre se per riferimento - un riferimento. È importante prestare attenzione quando si lavora con riferimenti, puntatori, qualificatori const.
Esempio importante:
std::vector<int> v = {1,2,3}; for (auto x : v) x = 0; // copia, v non cambierà for (auto& x : v) x = 0; // riferimento, gli elementi saranno azzerati
Quale tipo avrà la variabile 'z' nell'espressione
const auto z = foo();se il metodofoo()restituisce un riferimento a int (int&)?
Risposta:
const auto z dedurrà il tipo come int (valore), anche se viene restituito un riferimento. Per dedurre un riferimento è necessario auto& z. I qualificatori const si applicano al tipo dedotto dopo l'inferenza del tipo.
Esempio:
int x = 5; auto a = x; // a — int auto& b = x; // b — int& const auto c = x; // c — const int auto d = foo(); // d — int (se foo restituisce int) auto& e = foo(); // e — int&
Storia
In un grande servizio web hanno utilizzato il range-based for con auto invece di auto& su una collezione di smart pointer. Questo ha portato alla copia degli oggetti, rallentando il programma di 16 volte nell'elaborazione di milioni di registrazioni.
Storia
Nella libreria di gestione dei grafi, auto è stato applicato all'iteratore restituito, aspettandosi che fosse un riferimento, ma hanno ottenuto un oggetto temporaneo. L'iteratore è stato distrutto prematuramente, causando il crash del programma su UB dopo il ciclo.
Storia
Nel sistema finanziario, a causa dell'uso di auto per ottenere un valore da una mappa, è stata dimenticata la costanza della chiave, portando a tentare di modificare i dati tramite un riferimento non costante e causando successivi errori di compilazione e crash a runtime.