C++
Wnioskowanie typu
Szukaj…
Wprowadzenie
auto
type, które jest dostępne w C ++ 11.
Uwagi
Jest to zazwyczaj lepiej zadeklarować const
, &
i constexpr
każdym użyciu auto
, jeśli jest wymagane, aby zapobiec coraz niechcianych zachowań, takich jak kopiowanie lub mutacje. Te dodatkowe wskazówki zapewniają, że kompilator nie generuje żadnych innych form wnioskowania. Nie zaleca się również zbyt częstego używania auto
i powinno się go używać tylko wtedy, gdy rzeczywista deklaracja jest bardzo długa, szczególnie w przypadku szablonów STL.
Typ danych: Auto
Ten przykład pokazuje podstawowe wnioski, jakie kompilator może wykonać.
auto a = 1; // a = int
auto b = 2u; // b = unsigned int
auto c = &a; // c = int*
const auto d = c; // d = const int*
const auto& e = b; // e = const unsigned int&
auto x = a + b // x = int, #compiler warning unsigned and signed
auto v = std::vector<int>; // v = std::vector<int>
Jednak słowo kluczowe auto nie zawsze wykonuje oczekiwane wnioskowanie o typie bez dodatkowych wskazówek dla &
lub const
lub constexpr
// y = unsigned int,
// note that y does not infer as const unsigned int&
// The compiler would have generated a copy instead of a reference value to e or b
auto y = e;
Lambda auto
Słowo kluczowe auto typ danych to wygodny sposób dla programistów na deklarowanie funkcji lambda. Pomaga to przez skrócenie liczby tekstów, które programiści muszą wpisać, aby zadeklarować wskaźnik funkcji.
auto DoThis = [](int a, int b) { return a + b; };
// Do this is of type (int)(*DoThis)(int, int)
// else we would have to write this long
int(*pDoThis)(int, int)= [](int a, int b) { return a + b; };
auto c = Dothis(1, 2); // c = int
auto d = pDothis(1, 2); // d = int
// using 'auto' shortens the definition for lambda functions
Domyślnie, jeśli typ zwracany funkcji lambda nie jest zdefiniowany, zostanie on automatycznie wyprowadzony z typów wyrażeń zwrotnych.
Te 3 to w zasadzie to samo
[](int a, int b) -> int { return a + b; };
[](int a, int b) -> auto { return a + b; };
[](int a, int b) { return a + b; };
Pętle i auto
Ten przykład pokazuje, jak auto może być użyte do skrócenia deklaracji typu dla pętli
std::map<int, std::string> Map;
for (auto pair : Map) // pair = std::pair<int, std::string>
for (const auto pair : Map) // pair = const std::pair<int, std::string>
for (const auto& pair : Map) // pair = const std::pair<int, std::string>&
for (auto i = 0; i < 1000; ++i) // i = int
for (auto i = 0; i < Map.size(); ++i) // Note that i = int and not size_t
for (auto i = Map.size(); i > 0; --i) // i = size_t