programowanieBackend C++ Developer

Opisz słowo kluczowe 'auto' w C++. Jak działa przy wnioskowaniu typu i w jakich przypadkach może prowadzić do błędów? Kiedy użycie auto jest potencjalnie niebezpieczne?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź

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

Pytanie z pułapką

Jaki typ będzie miała zmienna 'z' w wyrażeniu const auto z = foo(); jeśli metoda foo() 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&

Przykłady rzeczywistych błędów z powodu niewiedzy na temat szczegółów tematu.


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.