C++26 не смогли утвердить впервые в истории языка. Теперь обновление может задержаться на годы
Новый стандарт C++26, который должен был принести языку программирования одно из крупнейших обновлений за последние годы, неожиданно провалил международное голосование. Национальные комитеты Международной организации по стандартизации (ISO) отказались утверждать подготовленный документ. Впервые за всю историю основного стандарта C++ проект очередной версии не смог пройти заключительный этап согласования. Теперь разработчикам придётся искать компромисс, а выпуск C++26 может существенно задержаться или вовсе не состояться.
Голосование завершилось в конце октября после 12 недель обсуждения. Для утверждения проекта требовалась поддержка не менее двух третей национальных комитетов с правом решающего голоса, а доля отрицательных голосов не должна была превышать 25%. Согласно опубликованным подсчётам, C++26 поддержали 12 из 20 проголосовавших комитетов соответствующей категории, или 60%. Одновременно против выступили девять из 22 комитетов, голоса которых учитывались при подсчёте возражений. Таким образом, проект не выполнил сразу два обязательных условия. Подробные официальные результаты ISO публично не раскрыла.
Главным предметом разногласий стала поддержка контрактного программирования (Contracts). Механизм позволяет разработчикам прямо в коде указывать требования к работе функций и проверять соблюдение заданных условий. Например, функция вычисления квадратного корня может требовать, чтобы входное число не было отрицательным, и проверять корректность возвращаемого результата. Для описания подобных требований C++26 предлагает три новые конструкции: pre для предусловий, post для постусловий и contract_assert для дополнительных проверок.
Контракты призваны упростить поиск ошибок и сделать поведение программ более предсказуемым. Однако реализация вызвала серьёзные споры. Проект предусматривает несколько режимов выполнения проверок: компилятор может полностью пропустить проверку, зафиксировать нарушение с возможностью продолжения работы или завершить программу. Конкретный режим выбирает реализация, а не сам код с контрактом. Противники предложенного подхода опасаются, что программисты начнут воспринимать записанные условия как гарантии безопасности, хотя некоторые проверки могут вообще не выполняться.
Среди критиков оказался и создатель C++ Бьёрн Страуструп. Вместе с несколькими участниками комитета разработчик раскритиковал реализацию контрактов в документе P4334R0. Авторы считают предложенный механизм слишком сложным, недостаточно проверенным на практике и неспособным обеспечить необходимые гарантии безопасности. Дополнительные опасения связаны с возможным увеличением объёма кода, снижением производительности и появлением новых ошибок. При этом критики не отвергают саму идею контрактного программирования, а предлагают разработать более простой и надёжный механизм.
История споров вокруг контрактов началась задолго до подготовки C++26. Подобную функциональность собирались включить ещё в C++20, но в 2019 году исключили из проекта для дальнейшей переработки. Специализированная рабочая группа продолжила разработку, а комитет WG21 неоднократно голосовал за включение контрактов в язык. В марте 2026 года на заседании в британском Кройдоне участники завершили техническую подготовку C++26 и одобрили передачу проекта на международное утверждение. Решение поддержали 114 человек, против проголосовали 12.
Сторонники контрактов считают отказ национальных комитетов особенно болезненным после многолетнего согласования. В опубликованном 23 октября документе P4433R0 группа из 16 специалистов предложила сохранить механизм в C++26 и провести повторное голосование без существенного изменения спецификации. Авторы настаивают, что технические возражения уже неоднократно обсуждались, а решение WG21 отражает устойчивую поддержку большинства участников. Противники, напротив, считают преждевременным закрепление спорных правил в международном стандарте.
Член немецкого комитета по стандартизации C++ Андреас Фертиг обратил внимание на нарушение сложившейся практики. Раньше национальные комитеты обычно принимали технические компромиссы, достигнутые в WG21, и выступали против подготовленных стандартов преимущественно при обнаружении новых недостатков или процедурных нарушений. При обсуждении C++26 возражения касались вопросов, которые рабочие группы уже рассматривали. Фертиг опасается, что конфликт подорвёт доверие между участниками и затруднит дальнейшее развитие языка.
Последствия голосования выходят далеко за пределы контрактного программирования. В C++26 подготовили целый набор крупных изменений, включая рефлексию времени компиляции, позволяющую программам анализировать собственную структуру и генерировать код. Проект предусматривает новую модель асинхронных вычислений std::execution, средства векторных вычислений std::simd и дополнительные механизмы защиты памяти. Все перечисленные возможности входят в документ, который пока не получил международного утверждения. Задержка стандартизации способна повлиять на планы разработчиков компиляторов, библиотек и крупных программных проектов.
При этом отказ ISO не означает, что подготовленные технологии немедленно исчезнут из инструментов разработки. Компиляторы уже реализуют отдельные возможности C++26 в экспериментальном режиме. Например, GCC 16 поддерживает контракты и рефлексию, хотя для использования некоторых возможностей требуются специальные параметры компиляции. Разработчики смогут продолжать эксперименты, но до окончательного утверждения стандарта совместимость и поведение отдельных функций могут меняться.
Теперь у участников стандартизации остаётся несколько вариантов. Комитет может переработать проект и отправить на повторное голосование, вернуть спецификацию на предыдущую стадию обсуждения или предложить выпуск технической спецификации без статуса полноценного международного стандарта. Самый радикальный сценарий предусматривает отмену C++26. Тогда действующим стандартом останется C++23, а подготовленные нововведения придётся повторно согласовывать для C++29. Некоторые возможности при подобном развитии событий могут вообще не попасть в следующую версию языка.
Следующее заседание WG21 пройдёт с 16 по 21 ноября 2026 года в бразильском Бузиусе. Участникам предстоит разобрать замечания национальных комитетов и определить дальнейшую судьбу C++26. От способности сторон договориться зависит не только срок публикации нового стандарта, но и график работы над C++29. Пока решения нет, разработка языка оказалась в непривычном положении: технические изменения уже согласованы внутри WG21, но международного одобрения добиться не удалось.