Ricerca…


introduzione

Questo argomento tratta sul tipo di inferenze che coinvolge la parola chiave auto tipo che è disponibile da C ++ 11.

Osservazioni

Di solito è meglio dichiarare const e & constexpr ogni volta che si utilizza l' auto se è necessario per evitare comportamenti indesiderati come la copia o le mutazioni. Questi ulteriori suggerimenti assicurano che il compilatore non generi altre forme di inferenza. Inoltre, non è consigliabile utilizzare l' auto e deve essere utilizzato solo quando la dichiarazione effettiva è molto lunga, specialmente con i modelli STL.

Tipo di dati: automatico

Questo esempio mostra le inferenze di tipo di base che il compilatore può eseguire.

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>

Tuttavia, la parola chiave auto non esegue sempre l'inferenza di tipo prevista senza ulteriori suggerimenti per & o const o 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

Il tipo di dati parola chiave automatica è un modo conveniente per i programmatori di dichiarare funzioni lambda. Aiuta accorciando la quantità di programmatori di testo che è necessario digitare per dichiarare un puntatore a funzione.

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

Per impostazione predefinita, se il tipo restituito di funzioni lambda non è definito, verrà automaticamente dedotto dai tipi di espressione di ritorno.

Questi 3 sono fondamentalmente la stessa cosa

[](int a, int b) -> int  { return a + b; };
[](int a, int b) -> auto { return a + b; };
[](int a, int b) { return a + b; };

Cicli e auto

Questo esempio mostra come auto può essere usato per abbreviare la dichiarazione del tipo per i loop

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow