Поделиться через


автоматическое ключевое слово (вычет тип)

Выводит тип объявленной переменной из выражения инициализации.

auto declarator initializer;

Заметки

Ключевое слово auto образом, компилятор использует выражение инициализации объявленной переменной, чтобы вывести его тип.

ПримечаниеПримечание

До версии Visual C++ 2010 ключевое слово auto был описателем для автоматического класса памяти.То потребление теперь ошибка.Параметр компилятора /Zc:auto, который используется по умолчанию, заставляет компилятор использует новое значение ключевого слова auto.

Рекомендуется использовать ключевое слово auto для большей части ситуаци- при действительно нужно преобразование-, поскольку оно предоставляет следующие преимущества:

  • Надежность: если. этот тип выражения включает, если возвращаемый тип функции. просто работает.

  • Производительность. можно гарантировать, что будет преобразование.

  • Для удобства использования. можно не беспокоиться о трудностях и typos написание имени типа.

  • Эффективность: запросит кодирование может быть более эффективным.

Случаи, в которых нет преобразования можно использовать auto.

  • При необходимости определенный тип и ничего не делает.

  • Вспомогательные шаблона выражения тип- для примера, (valarray+valarray) и список- инициализатора редко выбрана установка хотя бы одну запись auto x = { 1 }; и ожидается для доступа к int.

Чтобы использовать ключевое слово auto, используйте его вместо типа для объявления переменной, и задайте выражение инициализации.Кроме того, можно изменить с помощью описателей ключевое слово auto и деклараторов, такие как const, volatile, указатель (*) ссылку (&), ссылка rvalue (&&).Компилятор вычисляет выражение инициализации и затем использует эти сведения для того, чтобы вывести тип переменной.

Выражение инициализации может быть назначением (синтаксисом со знаком равенства), непосредственно инициализацией (синтаксисом функция- стиль), или выражением оператор new.Или выражение инициализации может быть параметром для-диапазон-объявление в инструкцию Основанное на диапазоне выражение for (C++).Дополнительные сведения см. в разделе Инициализаторы и примеры кода далее в этом документе.

Ключевое слово auto заполнитель для типа, но сам не является типом.Поэтому ключевое слово auto нельзя использовать в приведениях или операторах, такие как результат и typeid.

Практичность

Ключевое слово auto - это простой способ объявления переменной, которая имеет сложный тип.Например, можно использовать auto для объявления переменной, где выражение инициализации включает шаблоны, указателей на функции или указателей на члены.

Можно также использовать auto объявить и инициализировать переменную в лямбда-выражение.Нельзя объявить себя тип переменной, поскольку тип лямбда-выражения известен только компилятору.Для получения дополнительной информации см. Примеры лямбда-выражений.

auto можно использовать вместе с описателем типа decltype и позволяют создавать библиотеки шаблонов.Классы auto и decltype для объявления функции шаблона, возвращаемый тип которой зависит от типов аргументов шаблона.Или используйте auto и decltype для объявления функции шаблона, создайте вызов другой функции, а затем возвращает все, что угодновсе, что любые значения, возвращаемого этой другой функции.Для получения дополнительной информации см. описатель типа decltype.

Ограничения и сообщения об ошибках.

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

Номер ошибки

Описание

C3530

Ключевое слово auto нельзя использовать в сочетании с другим описателем типа.

C3531

Символ, объявленный с помощью ключевого слова auto, должен иметь инициализатор.

C3532

Неверно используется ключевое слово auto для объявления типа.Например, был объявлен тип возвращаемого значения метода или массив.

C3533, C3539

Аргумент параметра или шаблона нельзя объявлять с помощью ключевого слова auto.

Ошибка C3534

Символ, объявленный с помощью ключевого слова auto в выражении new должен иметь инициализатор.Для получения дополнительной информации см. operator new (<new>).

C3535

Метод или параметр шаблона нельзя объявлять с помощью ключевого слова auto.

C3536

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

C3537

Нельзя преобразовать в тип, объявленный с помощью ключевого слова auto.

C3538

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

C3540, C3541

Операторы результат и typeid нельзя применить к символам, объявленный с помощью ключевого слова auto.

Примеры

Эти фрагменты кода, некоторые ситуации, когда можно использовать ключевое слово auto.

Следующие объявления эквивалентны.В первой инструкцию, объявляется переменная j типа int.Во второй инструкцию, дедуцированы является переменная k типа int, поскольку выражение инициализации (0) целое число.

   int j = 0;  // Variable j is explicitly type int.
   auto k = 0; // Variable k is implicitly type int because 0 is an integer.

Следующие объявления эквивалентны, но второй объявление проще, чем первое.Один из самых убедительных аргументов простоты использования ключевого слова auto.

   map<int,list<string>>::iterator i = m.begin(); 
   auto i = m.begin(); 

В следующем фрагменте кода объявляет тип переменной iter и elem после начала циклов for и for диапазона.

// cl /EHsc /nologo /W4
#include <deque>
using namespace std;

int main()
{
    deque<double> dqDoubleData(10, 0.1);

    for (auto iter = dqDoubleData.begin(); iter != dqDoubleData.end(); ++iter)
    { /* ... */ }

    // prefer range-for loops with the following information in mind
    // (this applies to any range-for with auto, not just deque)

    for (auto elem : dqDoubleData) // COPIES elements, not much better than the previous examples
    { /* ... */ }

    for (auto& elem : dqDoubleData) // observes and/or modifies elements IN-PLACE
    { /* ... */ }

    for (const auto& elem : dqDoubleData) // observes elements IN-PLACE
    { /* ... */ }
}

В следующем фрагменте кода используется оператор и объявление указателя new для объявления указатели.

   double x = 12.34;
   auto *y = new auto(x), **z = new auto(&x);

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

   auto x = 1, *y = &x, **z = &y; // Resolves to int.
   auto a(2.01), *b (&a);         // Resolves to double.
   auto c = 'a', *d(&c);          // Resolves to char.
   auto m = 1, &n = m;            // Resolves to int.

Этот фрагмент кода используется условный оператор (?:) для объявления переменной x как целое число, которое имеет значение 200.

   int v1 = 100, v2 = 200;
   auto x = v1 > v2 ? v1 : v2;

В следующем фрагменте кода инициализирует переменную x для ввода int, переменная y в ссылке для ввода constint, и переменная fp на указатель на функцию, которую возвращает тип int.

int f(int x) { return x; }
int main()
{
    auto x = f(0);
    const auto & y = f(1);
    int (*p)(int x);
    p = f;
    auto fp = p;
    //...
}

См. также

Ссылки

автоматическое ключевое слово

Описатели Хранени-Класса

Ключевые слова C++

/Zc:auto (выведение типа переменной)

оператор sizeof

typeid

operator new (<new>)

Объявления

Примеры лямбда-выражений

Инициализаторы

описатель типа decltype