Комитет ISO завершил техническую подготовку стандарта C++26.

C++ подошел к самой важной развилке за много лет. Комитет ISO завершил техническую работу над стандартом C++26, закрыл последние международные замечания и готовит финальный проект к утверждению. Для разработчиков новость важна не только формально: новый стандарт приносит сразу несколько крупных изменений, от рефлексии до встроенных механизмов повышения безопасности памяти, причем часть улучшений заработает уже после простой перекомпиляции существующего кода.
Финальная встреча прошла в Кройдоне, недалеко от Лондона. В обсуждении участвовали около 210 человек из 24 стран: примерно 130 приехали очно, еще 80 подключились удаленно. Комитет не добавлял новые возможности и не вычеркивал старые, а занимался доводкой черновика и разбором 411 комментариев, которые национальные органы прислали после международного голосования по проекту стандарта.
Авторы отчета называют C++26 самым сильным релизом со времен C++11. Главной новинкой стала рефлексия времени компиляции. Язык впервые получает полноценные средства для описания собственной структуры и генерации нового кода на базе такой информации. Внутри сообщества C++ такую возможность уже называют одним из самых глубоких сдвигов в истории языка, сравнимым по значимости с появлением шаблонов.
Не менее заметный блок изменений связан с безопасностью памяти. В C++26 убирают целый класс неопределенного поведения при чтении неинициализированных локальных переменных. Кроме того, стандартная библиотека получает режим усиленной защиты с проверками границ для многих популярных операций над vector, span, string, string_view и рядом других типов. Разработчики подчеркивают, что часть защиты можно получить без переписывания проекта, просто собрав код как C++26.
В отчете приводят и практические цифры. В Google похожие механизмы уже использовались в промышленной эксплуатации на сотнях миллионов строк кода. По словам авторов, внедрение помогло исправить более 1000 ошибок, в будущем может предотвращать еще от 1000 до 2000 багов в год и сократило частоту сбоев с segmentation fault на 30%. Средняя потеря производительности составила около 0,3%, что для подобных защит выглядит очень скромной ценой.
Еще одна крупная новинка C++26, контракты, добралась до финиша после долгих споров. Стандарт вводит предусловия, постусловия и специальную форму утверждений contract_assert. Вокруг механизма шли затяжные технические дискуссии, часть экспертов выступала против, но комитет в итоге сохранил контракты в финальной версии. При итоговом голосовании за выпуск стандарта 114 участников поддержали решение, 12 высказались против, трое воздержались.
Четвертый большой блок, std::execution, должен стать общей моделью асинхронного выполнения для C++. Речь идет о едином подходе к параллелизму и конкурентным вычислениям. Авторы отчета считают направление особенно важным еще и потому, что такая модель упрощает построение программ без гонок данных. При этом внедрение пока потребует усилий: документации мало, вспомогательных библиотек не хватает, а разработчикам, скорее всего, придется отдельно учиться и адаптировать существующий асинхронный код.
Помимо четырех главных новинок, в стандарт вошли и другие заметные возможности. В C++26 добавили библиотеку std::simd для распараллеливания операций над данными через SIMD-инструкции, такие как AVX-512 и NEON. Появился и std::inplace_vector - контейнер с API, близким к std::vector, но с хранением элементов внутри самого объекта, без размещения в куче. Еще одно практичное новшество - директива #embed, которая позволяет встраивать бинарные ресурсы прямо в код.
Комитет ожидает, что бизнес начнет переходить на C++26 быстрее, чем на C++17, C++20 и C++23. Причина проста: набор новых возможностей выглядит намного более востребованным для повседневной разработки. Дополнительный фактор, который подталкивает рынок вперед, уже готовящиеся реализации. В отчете сказано, что GCC и Clang по ходу разработки успевали реализовывать примерно две трети функций стандарта, а в дереве GCC уже появились рефлексия и контракты. Часть возможностей нового стандарта уже поддерживается в GCC, Clang и Microsoft Visual C++.
На том же заседании комитет утвердил график работы над C++29. Главной темой следующего цикла снова станет безопасность, прежде всего сокращение числа опасных конструкций и развитие профилей, которые помогут сильнее ограничивать рискованный код. В обсуждениях участвовали как профильные подгруппы, так и крупные вечерние сессии с десятками специалистов. В частности, представители Apple рассказали о практическом опыте ужесточения правил для более чем 4 млн строк кода WebKit в документе P4158R0. По их словам, такой подход уже закрыл несколько классов уязвимостей и помог предотвратить эксплуатацию новых и старых ошибок.
Следующие встречи комитета пройдут в июне в Брно и в ноябре в бразильском Бузиусе. Там участники начнут добавлять новые возможности в рабочий проект C++29. До официальной публикации остается еще редакторская стадия: в ближайшие два месяца документ будут готовить к выпуску, а итоговая версия должна выйти под именем ISO/IEC 14882:2026. Но главный вывод уже ясен: C++26 закрывает эпоху, в которой язык слишком долго мирился с опасными компромиссами вокруг памяти, и делает первый большой шаг к модели safer by default, не отказываясь от привычного для C++ требования к эффективности.