ProgrammatieBackend C++ ontwikkelaar

Beschrijf het sleutelwoord 'auto' in C++. Hoe werkt het bij type-inferentie en in welke gevallen kan het leiden tot fouten? Wanneer is het gebruik van auto potentieel gevaarlijk?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord

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

Misleidende vraag

Wat voor type zal de variabele 'z' hebben in de expressie const auto z = foo(); als de methode foo() 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&

Voorbeelden van echte fouten door gebrek aan inzicht in de nuances van het onderwerp.


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.