Szukaj…


Wprowadzenie

W tym temacie omówiono wnioskowanie typu, które obejmuje słowo kluczowe 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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow