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

156
15 декабря 2016, 16:03

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

Answer 1

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

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

Answer 2

Каменный век

Ключевое слово 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 в меру. Не надо впадаться в крайности.

READ ALSO
Не компилируется драйвер RT5572 на Raspberry PI

Не компилируется драйвер RT5572 на Raspberry PI

Не получается скомпилировать драйвер для WI-Fi usb: rt5572stako

257
Алгоритмическая сложность операций с NSMutableArray

Алгоритмическая сложность операций с NSMutableArray

Как ответить на следующих вопрос? Он будет на собеседовании на работу

180
Статический класс qt

Статический класс qt

Создаю класс, в нем есть 2 метода и статические свойства для хранения данныхЗадача: имеется 2 класса, один из них изменяет значения статического...

205