November 19, 2020

Ключевое слово auto

Начиная с C++11, ключевое слово auto при инициализации переменной может использоваться вместо типа переменной, чтобы сообщить компилятору, что он должен присвоить тип переменной исходя из инициализируемого значения. Это называется выводом типа (или «автоматическим определением типа данных компилятором»). Например:

auto x = 4.0; // 4.0 - это литерал типа double, поэтому и x должен быть типа double
auto y = 3 + 4;  // выражение 3 + 4 обрабатывается как целочисленное, поэтому и переменная y должна быть типа int

Это работает даже с возвращаемыми значениями функций:

int subtract(int a, int b){
    return a-b;
}

int main(){
    auto result = subtract(4, 3); // функция subtract() возвращает значение типа int и, следовательно, переменная result также должна быть типа int
}

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

Многие новички пытаются сделать что-то вроде следующего:

void mySwap(auto a, auto b){
    auto x = a;
    a = b;
    b = x;
}

Это не сработает, так как компилятор не может определить типы данных для параметров функции a и b во время компиляции. Если вы хотите создать функцию, которая будет работать с разными типами данных, то вам лучше воспользоваться шаблонами функций, а не выводом типа.

Когда же использовать ключевое слово auto?

Используя ключевое слово auto вместо фундаментальных типов данных (int, double, char, и т.д.), мы не сэкономим много времени или усилий. В таких случая лучше использовать непосредственные названия типов. Это повысит читаемость кода.

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

vector<int> v;
vector<int>::iterator it1 = v.begin();
auto it2 = v.begin(); // так намного короче и читаемость не теряется

Также слово auto можно использовать в цикле for:

for(const auto& n : v){
    // на каждой итерации цикла получаем элемент n контейнера v
}