Вышел новый релиз C++: что изменилось в языке программирования
Международный комитет по стандартизации C++ (ISO/IEC JTC1/SC22/WG21) официально утвердил очередную версию стандарта — C++23. Этот релиз приносит долгожданные улучшения, которые делают язык более безопасным, выразительным и удобным для разработки как системного, так и прикладного ПО. Рассказываем о самых значимых нововведениях.
Главные изменения в C++23
1. std::print — форматированный вывод без лишних усилий
Одной из самых заметных фич стало появление функции std::print. Теперь для вывода в стандартный поток не нужно писать громоздкие конструкции с std::cout или использовать printf с риском ошибок типов. std::print работает на основе std::format, обеспечивая типобезопасность и читаемость:
- Автоматическое форматирование чисел, строк и пользовательских типов.
- Поддержка локалей и Unicode.
- Скорость близка к
printf, но без утечек памяти.
2. Улучшенная работа с корутинами
Корутины, впервые появившиеся в C++20, получили ряд исправлений и дополнений. В C++23 упростился синтаксис объявления асинхронных функций, а также добавлена поддержка std::generator — нового типа для создания последовательностей значений на лету:
- Генераторы позволяют писать ленивые вычисления без ручного управления состоянием.
- Уменьшился объем шаблонного кода для работы с корутинами.
3. Модули — стабильность и производительность
Хотя модули были введены в C++20, их реализация в компиляторах оставляла желать лучшего. В новом стандарте уточнены правила экспорта и импорта, что привело к:
- Сокращению времени компиляции крупных проектов до 2–3 раз.
- Полной совместимости с заголовочными файлами (гибридный режим).
- Возможности создавать модули для стандартной библиотеки (экспериментально).
4. Новые возможности constexpr и consteval
Расширение контекста константных выражений — одна из главных целей развития C++. В C++23 разрешено использовать constexpr для:
- Динамического выделения памяти (
std::vectorиstd::string). - Вызова виртуальных функций.
- Работы с плавающей точкой без потери точности.
Это позволяет выполнять всё больше вычислений на этапе компиляции, ускоряя runtime.
5. Атрибут [[assume]] — подсказки оптимизатору
Новый атрибут [[assume(выражение)]] сообщает компилятору, что выражение истинно в данной точке кода. Это даёт:
- Более агрессивные оптимизации (удаление ветвлений, свёртка циклов).
- Повышение производительности в критических участках (игровые движки, embedded).
6. Упрощение многопоточности
Добавлены новые типы для синхронизации: std::counting_semaphore с улучшенной производительностью и std::latch для одноразовых барьеров. Кроме того, появилась поддержка std::mdspan