Поиск…


Вступление

В этом разделе обсуждается тип ввода, включающий ключевое слово auto type, которое доступно на C ++ 11.

замечания

Обычно лучше объявлять const , & и constexpr всякий раз, когда вы используете auto если это требуется для предотвращения нежелательного поведения, такого как копирование или мутации. Эти дополнительные подсказки гарантируют, что компилятор не генерирует никаких других форм вывода. Также не рекомендуется использовать auto использование и должно использоваться только тогда, когда фактическое объявление очень длинное, особенно с шаблонами STL.

Тип данных: Авто

В этом примере показаны основные выводы типа, которые может выполнить компилятор.

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>

Однако ключевое слово auto не всегда выполняет ожидаемый вывод типа без дополнительных подсказок для & или const или 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

Автоматическое ключевое слово типа данных - удобный способ для программистов объявить лямбда-функции. Это помогает, сокращая количество текстовых программистов, которые нужно ввести, чтобы объявить указатель на функцию.

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

По умолчанию, если возвращаемый тип лямбда-функций не определен, он будет автоматически выведен из типов возвращаемых выражений.

Эти 3 - это в основном одно и то же

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

Петли и авто

В этом примере показано, как auto можно использовать для сокращения объявления типа для циклов

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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow