ProgrammazioneSviluppatore Backend C++

Descrivi la parola chiave 'auto' in C++. Come funziona l'inferenza del tipo e in quali casi può portare a errori? Quando l'uso di auto è potenzialmente rischioso?

Supera i colloqui con l'assistente IA Hintsage

Risposta

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

Domanda ingannevole

Quale tipo avrà la variabile 'z' nell'espressione const auto z = foo(); se il metodo foo() 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&

Esempi di errori reali a causa della mancanza di conoscenza delle sottigliezze dell'argomento.


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.