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

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

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

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

Ответ 1

auto было ключевым словом, которое C++ "унаследовало" от C, которое существовало там почти всегда, но практически никогда не использовалось, потому что было только два возможных условия: либо это было запрещено, либо предполагалось по умолчанию.

Использование auto для обозначения выведенного типа было впервые введено в C++ 11.

В то же время auto x = initializer выводит тип x из типа initializer таким же образом, как вывод типов шаблонов работает для шаблонов функций. Рассмотрим шаблон функции следующим образом:

template<class T>
int whatever(T t) { 
    // point A
};

В точке A тип был назначен для T на основе значения, переданного параметру в whatever. Когда вы делаете auto x = initializer; тот же тип удержания используется для определения типа для x из типа initializer который использовался для его инициализации.

Это означает, что большинство механизмов вывода типов, необходимых компилятору для реализации auto уже присутствовали и использовались для шаблонов в любом компиляторе, который даже пытался реализовать C++ 98/03. Таким образом, добавление поддержки auto было, по-видимому, довольно простым для практически всех команд компиляторов - оно было добавлено довольно быстро, и, похоже, с этим также было связано несколько ошибок.

Когда этот ответ был первоначально написан (в 2011 году, до того, как чернила высохли по стандарту C++ 11), auto уже был достаточно портативным. В настоящее время он полностью переносим среди всех основных компиляторов. Единственными очевидными причинами, по которым этого следует избегать, может быть то, что вам нужно написать код, совместимый с компилятором C, или у вас есть особая необходимость нацелиться на какой-то специализированный компилятор, который, как вы знаете, не поддерживает его (например, несколько человек все еще пишут код для MS-DOS с использованием компиляторов Borland, Watcom и т.д., которые не обновлялись в течение десятилетий). Если вы используете достаточно актуальную версию какого-либо из основных компиляторов, нет никаких причин избегать этого вообще.

Ответ 2

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

Ответ 3

Эта функциональность не была там всю жизнь. Он поддерживался в Visual Studio с версии 2010 года. Это новая функция С++ 11, поэтому она не является эксклюзивной для Visual Studio и является/будет переносной. Большинство компиляторов уже поддерживают его.

Ответ 4

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

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

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

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

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

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

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

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

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

Ответ 5

Это никуда не денется... это новая стандартная функция С++ в реализации С++ 11. При этом, хотя это замечательный инструмент для упрощения деклараций объектов, а также для очистки синтаксиса определенных парадигм вызова (т.е. Для диапазонов на основе циклов), не используйте его/злоупотреблять: -)