Słowo kluczowe auto w C++ (od C++11) pozwala kompilatorowi automatycznie wnioskować typ zmiennej z wyrażenia inicjalizującego. Ułatwia to pracę z długimi typami (na przykład przy pracy z iteratorami, lambdami, wyrażeniami szablonowymi) i zwiększa czytelność kodu.
Przykład użycia:
auto i = 42; // int auto d = 3.14; // double auto s = std::string("hi"); auto it = v.begin(); // iterator
Jednak auto wnioskowuje typ dokładnie na podstawie tego, co mu "podano". Na przykład, jeśli zwrócisz przez wartość, auto da wartość, a jeśli przez referencję — referencję. Należy być ostrożnym przy pracy z referencjami, wskaźnikami, kwalifikatorami const.
Ważny przykład:
std::vector<int> v = {1,2,3}; for (auto x : v) x = 0; // kopiowanie, v się nie zmieni for (auto& x : v) x = 0; // referencja, elementy zostaną zera
Jaki typ będzie miała zmienna 'z' w wyrażeniu
const auto z = foo();jeśli metodafoo()zwraca referencję do int (int&)?
Odpowiedź:
const auto z wnioskowało typ jako int (wartość), nawet jeśli zwracana jest referencja. Aby wnioskować referencję, należy użyć auto& z. Kwalifikatory const zostaną zastosowane do typu auto po wnioskowaniu typu.
Przykład:
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 (jeśli foo zwraca int) auto& e = foo(); // e — int&
Historia
W dużym serwisie internetowym używano pętli opartej na zakresie z auto zamiast auto& na kolekcji inteligentnych wskaźników. Prowadziło to do kopiowania obiektów, co spowolniło program 16 razy podczas przetwarzania milionów rekordów.
Historia
W bibliotece pracy z grafami zastosowano auto do zwracanego iteratora, oczekując, że to będzie referencja, a otrzymali obiekt tymczasowy. Iterator niszczył się wcześniej, po pętli program upadał na UB.
Historia
W systemie finansowym z powodu użycia auto do pobierania wartości z mapy zapomniano o constness klucza, co doprowadziło do próby modyfikacji danych przez nieconst referencję i skutkowało błędami kompilacji oraz awariami w czasie działania.