Поиск…
Вступление
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