Le mot-clé auto en C++ (depuis C++11) permet au compilateur d'inférer automatiquement le type d'une variable à partir de l'expression d'initialisation. Cela simplifie le travail avec des types longs (par exemple, lors de l'utilisation d'itérateurs, de lambdas, d'expressions template) et améliore la lisibilité du code.
Exemple d'utilisation :
auto i = 42; // int auto d = 3.14; // double auto s = std::string("hi"); auto it = v.begin(); // itérateur
Cependant, auto déduit le type exactement en fonction de ce qu'on lui "donne". Par exemple, si vous retournez par valeur, alors auto donnera une valeur, et si vous retournez par référence — une référence. Il faut faire attention lors de l'utilisation de références, de pointeurs et de qualifiers const.
Exemple important :
std::vector<int> v = {1,2,3}; for (auto x : v) x = 0; // copie, v ne changera pas for (auto& x : v) x = 0; // référence, les éléments seront remis à zéro
Quel type aura la variable 'z' dans l'expression
const auto z = foo();si la méthodefoo()retourne une référence sur int (int&)?
Réponse :
const auto z déduira le type comme int (valeur), même si une référence est retournée. Pour déduire une référence, il faut écrire auto& z. Les qualifiers const s'appliqueront au type auto après l'inférence de type.
Exemple :
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 (si foo retourne int) auto& e = foo(); // e — int&
Histoire
Dans un grand service web, ils ont utilisé un for basé sur les plages avec auto au lieu de auto& sur une collection de pointeurs intelligents. Cela a conduit à des copies d'objets, ce qui a ralenti le programme de 16 fois lors du traitement de millions d'enregistrements.
Histoire
Dans une bibliothèque de travail avec des graphes, auto a été appliqué au itérateur retourné, s'attendant à ce que ce soit une référence, mais ils ont reçu un objet temporaire. L'itérateur a été détruit prématurément, et après la boucle, le programme a échoué avec UB.
Histoire
Dans un système financier, à cause de l'utilisation de auto pour obtenir une valeur d'une map, ils ont oublié la constance de la clé, ce qui a conduit à une tentative de modification des données via une référence non constante et a causé des erreurs de compilation et des crashes à l'exécution.