Expressions and statements
ES.11
Используйте `auto` для исключения излишнего повторения имён типов
Причина
- Простое повторение утомительно и чревато ошибками.
- При использовании
autoимя объявляемой сущности находится на фиксированной позиции в объявлении, что повышает читаемость. - В объявлении шаблона функции возвращаемый тип может быть типом-членом.
Пример
Рассмотрим:
auto p = v.begin(); // vector<DataRecord>::iterator
auto z1 = v[3]; // создаёт копию DataRecord
auto& z2 = v[3]; // избегает копирования
const auto& z3 = v[3]; // const и избегает копирования
auto h = t.future();
auto q = make_unique<int[]>(s);
auto f = [](int x) { return x + 10; };
В каждом случае мы избегаем написания длинного, трудно запоминаемого типа, который компилятор уже знает, а программист мог бы ошибиться.
Пример
template<class T>
auto Container<T>::first() -> Iterator; // Container<T>::Iterator
Исключение
Избегайте auto для списков инициализаторов и в случаях, когда вы точно знаете, какой тип хотите, и где инициализатор может потребовать преобразования.
Пример
auto lst = { 1, 2, 3 }; // lst является initializer list
auto x{1}; // x является int (в C++17; initializer_list в C++11)
Примечание
Начиная с C++20, мы можем (и должны) использовать концепты для более точного определения выводимого типа:
// ...
forward_iterator auto p = algo(x, y, z);
Пример (C++17)
std::set<int> values;
// ...
auto [ position, newly_inserted ] = values.insert(5); // извлечение членов std::pair
Контроль
Отмечайте излишнее повторение имён типов в объявлении.