Современный C++: auto, nullptr, range-for и structured bindings
auto
auto просит компилятор вывести тип из инициализатора:
auto count = 10; // intconst auto ratio = 0.5; // const doubleИспользуй его, когда тип очевиден из правой части или слишком громоздок, но не скрывай важный смысловой тип без причины.
nullptr
Для нулевого указателя используй nullptr, а не целочисленный 0 или макрос NULL:
int* ptr = nullptr;nullptr имеет собственный тип и лучше участвует в разрешении перегрузок.
range-based for
for (const auto& item : items) { Process(item);}Цикл по диапазону удобнее ручного счётчика, когда нужен каждый элемент контейнера.
Инициализация фигурными скобками
int count{10};std::vector<int> values{1, 2, 3};Фигурная инициализация помогает избежать некоторых сужающих преобразований, но у контейнеров может означать список элементов, а не размер. Например, std::vector<int> a(5) создаёт пять элементов, а std::vector<int> b{5} — один элемент со значением 5.
Structured bindings (C++17)
std::pair<int, std::string> result{200, "OK"};auto [code, message] = result;Можно распаковывать пары, кортежи и подходящие структуры. Добавь auto& или const auto&, если нужна ссылка на исходные данные.
constexpr
constexpr позволяет вычислять значения и функции во время компиляции, когда условия это допускают. Это полезно для констант и вычислений, которые действительно должны быть известны компилятору.
Итог
Современные возможности C++ помогают писать выразительнее, но не отменяют необходимости понимать типы, время жизни и стоимость копирования. Используй функции языка для повышения ясности, а не только ради сокращения кода.
