C++26 завершён — самый значимый релиз со времён C++11 с рефлексией и безопасностью памяти

Ключевые фичи: compile-time рефлексия (P2996), безопасные указатели через lifetime analysis и контракты (expects/ensures). ISO голосование прошло единогласно.

Обложка: C++26 завершён — самый значимый релиз со времён C++11 с рефлексией и безопасностью памяти

Комитет ISO завершил техническую работу над C++26. По масштабу изменений — рефлексия, безопасность памяти, контракты, std::execution — это самый значимый релиз со времён C++11.

В субботу, 29 марта, около 210 экспертов из 24 стран — 130 очно и 80 удалённо — разрешили оставшиеся международные комментарии на встрече в Лондоне (Кройдон, Великобритания). Документ отправляется на финальное голосование ISO (DIS — Draft International Standard) и будет опубликован в ближайшее время.

Ключевые выводы

— C++26 завершён — самый значимый релиз со времён C++11

— Четыре главные фичи: рефлексия, безопасность памяти, контракты, std::execution

— Рефлексия позволяет C++ инспектировать и генерировать собственный код на этапе компиляции

— Hardened stdlib уже развёрнута в Google (1000+ багов исправлено, segfault-ы −30%) и Apple с оверхедом 0,3%

— GCC уже имеет рефлексию и контракты в trunk — можно пробовать сейчас

— Работа над C++29 стартует в июне с фокусом на дальнейшую безопасность памяти

Четыре главные фичи C++26

Херб Саттер, почётный председатель комитета ISO C++ (chair emeritus с 2025 года), называет их «Fab Four» — четвёрка фич, которые делают C++26 прорывным релизом.

1. Рефлексия — крупнейшее обновление со времён шаблонов

Compile-time рефлексия позволяет C++ описывать самого себя и генерировать код на этапе компиляции. Оператор ^ (reflection operator) превращает сущность в её метаданные, а шаблонные функции из пространства std::meta позволяют работать с ними:

			// Автоматическая сериализация — без макросов и кодогенерации
struct Point { int x; int y; };

consteval auto to_json(auto const& obj) {
    std::string result = "{";
    // ^Point даёт метаинформацию о типе
    template for (constexpr auto member : std::meta::members_of(^Point)) {
        result += '"' + std::string(std::meta::name_of(member)) + '"';
        result += ": " + std::to_string(obj.[:member:]);
    }
    return result + "}";
}
		

По словам Саттера, это «самый мощный новый движок для выражения эффективных абстракций за всю историю C++». Рефлексия попала в драфт C++26 ещё в июне 2025 года.

2. Меньше UB — больше безопасности памяти

C++26 делает существующий код безопаснее просто при перекомпиляции, без изменений в исходниках. UB (undefined behavior, неопределённое поведение) — исторически главный источник уязвимостей в C++. Два ключевых улучшения:

  • Чтение неинициализированных переменных больше не UB. Целая категория уязвимостей исчезает при переходе на C++26
  • Hardened стандартная библиотека — автоматические проверки границ при обращении к элементам vector, span, string, string_view и десятков других типов. При выходе за границы — trap вместо тихого повреждения памяти

Это не теоретический дизайн. В Google hardened stdlib уже развёрнута на сотнях миллионов строк C++: исправлено более 1000 багов, прогноз — предотвращение 1000–2000 багов в год, segfault-ы по всему production-флоту снизились на 30%. В Apple — аналогичный масштаб. Средние накладные расходы — всего 0,3% производительности.

Из сотен миллионов строк C++ в Google только пять сервисов полностью отказались от hardening из-за проблем с производительностью. Гранулярный API для небезопасного доступа использовался всего в семи местах.
Эндрю Вэннет и др.ACM Queue, «Practical Security in Production», ноябрь 2025

3. Контракты: pre, post, contract_assert

Языковые контракты позволяют задавать предусловия, постусловия и утверждения прямо в объявлениях функций — вместо хрупкого макроса assert из C, который не знает ни о параметрах, ни о возвращаемых значениях:

			// Предусловие: вектор не пустой
// Постусловие: результат — валидный элемент
int front(const std::vector<int>& v)
    pre(!v.empty())                     // проверка ДО вызова
    post(r: r == v[0])                  // проверка ПОСЛЕ вызова
{
    return v[0];
}

void process(int* data, int size) {
    contract_assert(size > 0);          // как assert, но лучше
    // ...
}
		

Фича вызвала серьёзные дебаты. Часть комитета считает, что текущий дизайн контрактов недостаточно продуман — в частности, спорным остаётся поведение при нарушении контракта (вызов хендлера vs немедленный terminate). На финальном голосовании 114 экспертов проголосовали за, 12 — против, 3 воздержались. Рекордно низкое число воздержавшихся показывает, что все определились с позицией.

4. std::execution — асинхронная модель C++

std::execution (Sender/Receiver) предоставляет унифицированный фреймворк для конкурентности и параллелизма. В отличие от std::async и сырых потоков, фреймворк обеспечивает структурированную конкурентность — код свободен от гонок данных по конструкции.

Саттер предупреждает: фича мощная (его компания Citadel Securities уже использует её в production), но пока её сложнее освоить, чем большинство фич C++ — не хватает документации и вспомогательных библиотек.

Быстрое внедрение

Саттер ожидает, что C++26 будет внедряться значительно быстрее, чем C++17/20/23. Две причины:

  1. Экстраординарный спрос. Рефлексия нужна всем, кто пишет сериализацию, ORM, конфигурации, логирование. Hardened stdlib даёт безопасность бесплатно. В отличие от нишевых фич C++20 (концепты, модули), здесь каждый C++-разработчик найдёт применение в своём коде
  2. Компиляторы уже готовы. На протяжении разработки C++26 и GCC, и Clang уже реализовали две трети фич. GCC уже имеет рефлексию и контракты в trunk — можно пробовать прямо сейчас

Как попробовать C++26 уже сейчас

Рефлексию и контракты можно попробовать в Compiler Explorer (godbolt.org), выбрав GCC trunk с флагом -std=c++26 -freflection. Hardened stdlib в libstdc++ активируется флагами:

			# GCC: hardened stdlib
g++ -std=c++26 -D_GLIBCXX_ASSERTIONS -O2 main.cpp

# Clang: libc++ hardening
clang++ -std=c++26 -D_LIBCPP_HARDENING_MODE=_LIBCPP_HARDENING_MODE_FAST main.cpp
		

C++29: ещё больше безопасности

На встрече приняли расписание C++29 (следующий трёхлетний цикл). Главный фокус — дальнейшее усиление безопасности памяти, в том числе профили безопасности Бьёрна Страуструпа.

Особенно примечателен доклад Оливера Ханта из Apple (P4158R0): WebKit захардинил более 4 миллионов строк кода подходом «подмножество надмножества» (аналогично Profiles). Результат: закрыты целые классы уязвимостей, политики предотвратили бы большинство исторических эксплойтов.

Следующие встречи комитета — в Брно (Чехия) в июне и в Бузиос (Рио-де-Жанейро, Бразилия) в ноябре, где начнётся работа над фичами C++29.

Частые вопросы
1
Когда выйдет C++26?

Техническая работа завершена 29 марта 2026 года. Документ отправлен на финальное голосование ISO (DIS). Публикация стандарта ожидается в ближайшие месяцы.

2
Какие компиляторы уже поддерживают C++26?

GCC уже имеет рефлексию и контракты в trunk. И GCC, и Clang реализовали около двух третей фич C++26 ещё до завершения стандарта. Попробовать можно в Compiler Explorer.

3
Нужно ли переписывать код для C++26?

Нет. Ключевые улучшения безопасности — устранение UB для неинициализированных переменных и hardened stdlib — работают при простой перекомпиляции существующего кода без изменений.

4
Что такое рефлексия в C++26?

Compile-time рефлексия позволяет коду C++ инспектировать собственные типы, функции и структуры на этапе компиляции и генерировать новый код на их основе. Это открывает возможности для автоматической сериализации, ORM, метапрограммирования без макросов и внешних кодогенераторов.

5
Чем подход C++26 к безопасности отличается от Rust?

Rust обеспечивает безопасность памяти через borrow checker на этапе компиляции. C++26 идёт эволюционным путём: hardened stdlib добавляет рантайм-проверки границ с минимальным оверхедом (0,3%), а устранение UB убирает целые классы уязвимостей при перекомпиляции. Подход C++ — обратная совместимость: миллиарды строк существующего кода становятся безопаснее без переписывания.

Выводы

C++26 — начало фундаментально новой эры: C++ становится безопаснее по умолчанию, оставаясь верным принципу zero-overhead. Рефлексия даёт инструмент, который заменит тонны макросов и кодогенераторов. Hardened stdlib уже доказала свою эффективность на сотнях миллионов строк кода в Google и Apple.

Подробный отчёт со встречи — в блоге Херба Саттера.