Для переменных указывает, что тип объявленной переменной будет автоматически определяться из ее инициализатора. Для функций указывает, что тип возвращаемого значения является конечным типом возвращаемого значения или будет выведен из его операторов возврата (начиная с 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 в соответствии с инициализатором, который используется в цикле for на основе диапазона.
Если 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) Объявление параметра функции. (понятия ТС)
Примечания
До C ++ 11 auto имел семантику спецификатора продолжительности хранения.
Смешивание автоматических переменных и функций в одном объявлении, как в auto f() -> int, i = 0;
, не допускается.
Для получения дополнительной информации: http://en.cppreference.com/w/cpp/language/auto