Het sleutelwoord auto in C++ (vanaf C++11) stelt de compiler in staat om automatisch het type van een variabele af te leiden uit de initialisatie-expressie. Dit vereenvoudigt het werken met lange types (bijvoorbeeld bij het werken met iterators, lambdas, sjabloon-expressies) en verbetert de leesbaarheid van de code.
Voorbeeld van gebruik:
auto i = 42; // int auto d = 3.14; // double auto s = std::string("hi"); auto it = v.begin(); // iterator
Echter, auto geeft het type precies aan op basis van wat er "gegeven" werd. Bijvoorbeeld, als een waarde wordt geretourneerd, geeft auto een waarde, en als het een verwijzing is — een verwijzing. Wees voorzichtig bij het werken met verwijzingen, pointers, const-kwalificaties.
Belangrijk voorbeeld:
std::vector<int> v = {1,2,3}; for (auto x : v) x = 0; // kopieren, v verandert niet for (auto& x : v) x = 0; // verwijzing, elementen worden 0
Wat voor type zal de variabele 'z' hebben in de expressie
const auto z = foo();als de methodefoo()een verwijzing naar int (int&) retourneert?
Antwoord:
const auto z zal het type afleiden als int (waarde), zelfs als een verwijzing wordt geretourneerd. Om een verwijzing af te leiden, moet je auto& z gebruiken. De kwalificaties const worden toegepast op het auto-type na de type-inferentie.
Voorbeeld:
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 (als foo int retourneert) auto& e = foo(); // e — int&
Verhaal
In een grote webservice werden range-based for-cycli met auto gebruikt in plaats van auto& voor een collectie van slimme pointers. Dit leidde tot het kopiëren van objecten, wat het programma 16 keer vertraagde bij het verwerken van miljoenen records.
Verhaal
In de bibliotheek voor grafverwerking werd auto toegepast op de geretourneerde iterator, in de veronderstelling dat dit een verwijzing zou zijn, maar in plaats daarvan kregen ze een tijdelijk object. De iterator werd te vroeg vernietigd, en na de lus viel het programma in UB.
Verhaal
In het financiële systeem werd door het gebruik van auto voor het verkrijgen van een waarde uit map de constness van de sleutel vergeten, wat leidde tot een poging om de gegevens te wijzigen via een niet-const verwijzing en vervolgens tot compileerfouten en runtime crashes.