[C++] Ключевое слово C ++ auto. Почему это волшебство?


Answers

Это просто занимает обычно бесполезное ключевое слово и дает ему новую, лучшую функциональность. Он стандартный в C ++ 11, и большинство компиляторов C ++ с поддержкой некоторых C ++ 11 будут поддерживать его.

Question

Из всего материала, который я использовал для изучения C ++, auto всегда был странным спецификатором продолжительности хранения, который не служил никакой цели. Но совсем недавно я столкнулся с кодом, который использовал его как имя типа сам по себе. Из любопытства я попробовал это, и он предполагает тип того, что я ему назначил!

Внезапно итераторы STL и, ну, все, что использует шаблоны, в 10 раз легче писать. Похоже, я использую «забавный» язык, такой как Python.

Где это ключевое слово было всю мою жизнь? Будете ли вы бросать мои мечты, говоря, что это эксклюзивно для визуальной студии или не переносится?




Для переменных указывает, что тип объявляемой переменной автоматически выводится из его инициализатора. Для функций указывает, что возвращаемый тип является возвращаемым типом возврата или будет выведен из его операторов возврата (начиная с C ++ 14).

Синтаксис

auto variable initializer   (1) (since C++11)

auto function -> return type    (2) (since C++11)

auto function   (3) (since C++14)

decltype(auto) variable initializer (4) (since C++14)

decltype(auto) function (5) (since C++14)

auto :: (6) (concepts TS)

cv(optional) auto ref(optional) parameter   (7) (since C++14)

объяснение

1) При объявлении переменных в области блока, в области пространства имен, в операциях инициализации for для циклов и т. Д. Ключевое слово auto может использоваться как спецификатор типа. После определения типа инициализатора компилятор определяет тип, который заменит ключевое слово auto, используя правила вывода аргумента шаблона из вызова функции (см. Вывод аргумента шаблона # Другие контексты для подробностей). Ключевое слово auto может сопровождаться модификаторами, такими как const или &, которые будут участвовать в выводе типа. Например, если задано const auto& i = expr; , тип i является точно типом аргумента u в воображаемом шаблоне template<class U> void f(const U& u) если компиляция функции f(expr) была скомпилирована. Следовательно, auto && может быть выведено либо в качестве ссылки на lvalue, либо в качестве значения rvalue в соответствии с инициализатором, который используется в цикле для диапазона. Если auto используется для объявления нескольких переменных, то соответствующие типы должны совпадать. Например, объявление auto i = 0, d = 0.0; плохо сформирован, а объявление auto i = 0, *p = &i; хорошо сформирована, а auto выводится как int.

2) В объявлении функции, использующем синтаксис типа возвращаемого типа, ключевое слово auto не выполняет автоматическое определение типа. Он служит только частью синтаксиса.

3) В объявлении функции, которое не использует синтаксис типа возвращаемого типа, ключевое слово auto указывает, что тип возвращаемого значения будет выводиться из операнда его оператора return, используя правила для вычитания аргумента шаблона.

4) Если объявленным типом переменной является decltype (auto), ключевое слово auto заменяется выражением (или списком выражений) его инициализатора, а фактический тип выводится с использованием правил для decltype.

5) Если возвращаемый тип функции объявлен decltype (auto), ключевое слово auto заменяется операндом его оператора return, а фактический тип возвращаемого значения выводится с использованием правил для decltype.

6) Спецификатор вложенного имени формы auto :: является заполнителем, который заменяется классом или типом перечисления, следуя правилам для вычитания замещаемого типа.

7) Объявление параметра в выражении лямбда. (поскольку C ++ 14) Объявление параметра функции. (понятия TS)

Примечания До C ++ 11 у авто была семантика спецификатора продолжительности хранения. Смешивание автоматических переменных и функций в одном объявлении, как в auto f() -> int, i = 0; не допускается.

Для получения дополнительной информации: en.cppreference.com/w/cpp/language/auto