Возможности 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.
Связанные понятия
Полезные ресурсы
🔤 Английские термины в этой теме
Слова из этой темы, которые русскоязычные часто произносят неверно. Кнопка 🔊 произносит голосом браузера.
- category /ˈkætəɡɔːri/ ударение на первый слог разбор: Немые буквы и ударение: cache, queue, suite, height
- recursive /rɪˈkɜːrsɪv/ «рикЁрсив» разбор: Флаги вслух: dash r, double-dash force
- intermediate /ˌɪntərˈmiːdiət/ ударение на «ми», русское «интермедиа» звучит с другим ударением разбор: Какой уровень нужен: A2, B1, B2 по ролям
- engineer /ˌɛndʒɪˈnɪər/ ударение на последний слог разбор: Нужен ли английский программисту
- implement /ˈɪmplɪmɛnt/ ударение на первый слог, а не «имплемЕнт» разбор: Глаголы: задеплоить, пофиксить, замержить, заапрувить
- parameter /pəˈræmɪtər/ ударение на «рэ», не «парамЕтер» разбор: Как читать код вслух
- compatible /kəmˈpætəbl/ ударение на второй слог, «кэмпЭтэбл» разбор: Читаем changelog: breaking change, deprecated, hotfix, backport