Das Schlüsselwort auto in C++ (seit C++11) ermöglicht es dem Compiler, den Typ einer Variablen automatisch aus dem initialisierenden Ausdruck abzuleiten. Dies vereinfacht die Arbeit mit langen Typen (z. B. bei der Arbeit mit Iteratoren, Lambdas, Vorlagen) und verbessert die Lesbarkeit des Codes.
Beispielverwendung:
auto i = 42; // int auto d = 3.14; // double auto s = std::string("hi"); auto it = v.begin(); // Iterator
Allerdings gibt auto den Typ genau nach dem zurück, was ihm "vorgelegt" wird. Wenn beispielsweise nach Wert zurückgegeben wird, gibt auto einen Wert zurück; wenn nach Referenz zurückgegeben wird, gibt es eine Referenz zurück. Man sollte vorsichtig sein beim Arbeiten mit Referenzen, Zeigern und const-Qualifikatoren.
Wichtiges Beispiel:
std::vector<int> v = {1,2,3}; for (auto x : v) x = 0; // Kopie, v wird nicht geändert for (auto& x : v) x = 0; // Referenz, Elemente werden auf 0 gesetzt
Welcher Typ wird die Variable 'z' im Ausdruck
const auto z = foo();haben, wenn die Methodefoo()eine Referenz auf int (int&) zurückgibt?
Antwort:
const auto z wird den Typ als int (Wert) ableiten, auch wenn eine Referenz zurückgegeben wird. Um eine Referenz abzuleiten, muss auto& z verwendet werden. Die Qualifikatoren const werden auf den auto-Typ nach der Typableitung angewendet.
Beispiel:
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 (wenn foo int zurückgibt) auto& e = foo(); // e — int&
Geschichte
In einem großen Webdienst wurde der range-based for-loop mit auto anstelle von auto& für eine Sammlung von intelligenten Zeigern verwendet. Dies führte zu einer Kopie der Objekte, was das Programm bei der Verarbeitung von Millionen von Datensätzen um das 16-fache verlangsamte.
Geschichte
In einer Graphbibliothek wurde auto auf den zurückgegebenen Iterator angewendet, in der Annahme, es wäre eine Referenz, aber es wurde ein temporäres Objekt erhalten. Der Iterator wurde vorzeitig zerstört, nach der Schleife stürzte das Programm aufgrund von UB ab.
Geschichte
In einem Finanzsystem wurde aufgrund der Verwendung von auto zur Gewinnung eines Wertes aus einer map die constness des Schlüssels vergessen, was zu einem Versuch führte, Daten über eine nicht-konstante Referenz zu modifizieren, und infolgedessen zu Kompilierungsfehlern und Abstürzen zur Laufzeit.