Возможности C++23

Тема дорожной карты · Modern C++ Developer

C++23 — стандарт, который не меняет язык так радикально, как C++20, но закрывает десятки повседневных неудобств. Обзорная тема «C++23 и далее» описывает, как стандарт принимался и что ждать дальше; здесь речь о конкретных возможностях, которые уже можно использовать в GCC 14, Clang 18 и MSVC 19.4x. Знание этих фич отличает разработчика, который следит за языком, от того, кто застрял на C++11 — и вопросы о них регулярно звучат на собеседованиях в сильные команды.

Как это работает

std::expected<T, E> даёт способ вернуть либо значение, либо ошибку без исключений: функция возвращает std::unexpected(err) при сбое, а вызывающий проверяет has_value() или использует монадические методы and_then, transform, or_else. std::print и std::println завершают историю форматированного вывода: std::println("{} = {}", name, value) печатает напрямую, без std::cout и без промежуточной строки, а форматы проверяются на этапе компиляции.

Deducing this — явный объектный параметр void f(this Self&& self) — позволяет писать одну функцию-член вместо четырёх перегрузок по константности и категории значения, а также реализовывать CRTP без шаблонного наследования и рекурсивные лямбды без std::function. std::mdspan даёт невладеющее многомерное представление над линейным буфером с настраиваемой раскладкой, а многомерный оператор индекса m[i, j] делает работу с матрицами естественной. std::generator — первый стандартный корутинный тип: функция с co_yield превращается в ленивый диапазон, совместимый с std::ranges.

Мелкие, но важные дополнения: if consteval для разного поведения в constexpr-контексте, std::flat_map и std::flat_set — контейнеры на отсортированных векторах для кэш-дружелюбных поисков, std::stacktrace для диагностики, std::to_underlying для enum class, суффикс uz для size_t, import std; для подключения всей стандартной библиотеки одним модулем.

Когда применять

Переходите на C++23, когда весь пул компиляторов проекта поддерживает нужные фичи: std::expected и std::print уже доступны широко, std::generator и import std; — только в свежих версиях. std::expected заменяет исключения там, где ошибка — ожидаемый результат (парсинг, сеть, файловая система). flat_map уместен для небольших словарей, которые часто читают и редко изменяют. mdspan выбирайте для численных вычислений вместо самодельных обёрток над vector<vector<T>>.

Типичные ошибки

Распространённая ошибка — использовать std::expected и при этом бросать исключения из тех же функций, смешивая две модели ошибок. Другая — считать std::print заменой логирования: он не потокобезопасен на уровне строк, и вывод из нескольких потоков перемешается. С flat_map ошибаются, вставляя элементы по одному в цикле: каждая вставка сдвигает хвост вектора, и сложность становится квадратичной; данные нужно собирать заранее. Наконец, import std; требует единой конфигурации сборки для всех целей — смешивание с #include тех же заголовков в одном проекте пока ломает MSVC и Clang.

Связанные понятия

Полезные ресурсы

🔤 Английские термины в этой теме

Слова из этой темы, которые русскоязычные часто произносят неверно. Кнопка 🔊 произносит голосом браузера.

Весь словарь терминов →