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

Рейтинг: 14Ответов: 2Опубликовано: 05.01.2015

Что значит ключевое слово auto в и где оно применяется?

Ответы

▲ 10Принят

Это слово переопределено в новом стандарте и говорит компилятору: «Компилятор, возьми и угадай тип этой переменной!». Компилятор в многих случаях это может сам прекрасно сделать. Это удобно в шаблонах и для итераторов.

Когда-то раньше это слово значило совсем другое.

▲ 16

Каменный век

Ключевое слово auto означает, что переменная находится в automatic storage и время жизни такой переменной local lifetime. Другими словами, мы указывали, что данная переменная лежит в стеке, но так как все переменные созданные в функциях как

int a = 10;

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

Начиная с С++11

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

#include <iostream>
#include <typeinfo>
#include <vector>
using namespace std;

class Foo
{
public:
    Foo( int x )
    {

    }
};
int main()
{
    std::vector<std::vector<Foo*>> arr;

    auto a = 166LL;
    auto b = 'a' + true;
    auto c = Foo(3);
    auto d = arr.begin();


    cout << typeid(a).name() << endl;
    cout << typeid(b).name() << endl;
    cout << typeid(c).name() << endl;
    cout << typeid(d).name() << endl;
    return 0;
}

Output: http://rextester.com/BNNAL62867

Особенности auto

  1. Переменная auto должна быть объязательно проинициализирована
  2. Переменная auto не может быть класс-мембером
  3. Переменная auto не может быть параметром функции до С++14
    http://ideone.com/n7dZge
  4. Тип auto не может быть возвращаемым типом функции до С++14. http://rextester.com/AFDFD63587

Холивар

Cторонники: есть типы данных в С++, которые портят читаемость когда своей длинной (про итераторы std::vector, к примеру) и хотелось бы писать меньше. Для modern C++ в условиях метапрограммирования возможность возврата типа auto делает шаблон гибким.
Противники: тип auto бьет по читабельности кода. Приходится гадать, что за переменная и делать лишнее действие в IDE наводя мышкой, чтобы понять что за тип. Такого рода "динамический тип" встает в разрез определению, что С++ строготипизированный язык.

Я же за использование auto в меру. Не надо впадаться в крайности.