C++26 не принят: национальные комитеты ISO забраковали стандарт из-за контрактного программирования
Голосование национальных комитетов ISO завершилось отказом утвердить международный стандарт C++26. Финальный вариант спецификации был принят ещё в марте, но на решающем этапе документ не набрал необходимой поддержки. Это первый подобный случай за всю историю развития основного стандарта языка.
Процедура утверждения стандарта C++ многоступенчата: после одобрения рабочей группой финальный проект рассылается национальным органам по стандартизации. Именно они выносят окончательный вердикт. На этот раз голоса распределились не в пользу предложенной редакции.
Ключевой причиной отклонения стало включение в C++26 элементов контрактного программирования. Речь идёт о трёх новых операторах: pre для предусловий, post для постусловий и contract_assert для проверки утверждений. Они позволяют формально описывать интерфейсы функций, задавая, что должно быть истинно до и после их выполнения.
Контрактное программирование — мощный инструмент для повышения надёжности кода. Предусловия определяют требования к входным данным, постусловия — гарантии результата, а утверждения проверяют логические инварианты. Однако реализация этих возможностей на уровне языка требует исключительной тщательности, чтобы не породить двусмысленности и неожиданные побочные эффекты.
Национальные комитеты сочли, что предложенная спецификация контрактов недостаточно проработана. Сложность новых механизмов и глубина их анализа не убедили экспертов в готовности к включению в стандарт. Опасения вызвали как семантика операторов, так и их взаимодействие с существующими конструкциями языка.
Примечательно, что из-за этих претензий был отклонён весь стандарт C++26 целиком, а не только раздел с контрактами. Такой исход стал неожиданностью для сообщества, поскольку остальные части спецификации, включая множество других нововведений, уже прошли многолетний цикл обсуждений и правок. Теперь будущее версии C++26 оказалось под вопросом.
Если комитет доработает спорные положения и повторно вынесет стандарт на голосование в следующем году, он может быть принят уже как C++27. Но не исключён и сценарий, при котором C++26 не появится вовсе, а все наработки перейдут в следующую крупную редакцию. Для языка, который десятилетиями эволюционировал через регулярные трёхлетние релизы, остановка утверждения — серьёзный прецедент.
Он показывает, что даже устоявшиеся процессы стандартизации могут давать сбои, когда предлагаемые изменения затрагивают фундаментальные аспекты синтаксиса и семантики. Разработчики, ожидавшие появления контрактов в C++26, теперь вынуждены ждать. Многие компании и open-source проекты уже планировали внедрение новых возможностей, ориентируясь на предварительные версии стандарта.
Задержка может повлиять на графики разработки компиляторов и инструментов. В ближайшие месяцы рабочая группа ISO по C++, вероятно, сосредоточится на пересмотре модели контрактов с учётом поступивших замечаний. От того, насколько быстро удастся найти консенсус, зависит, увидит ли свет C++26 в исходном виде или трансформируется в C++27 с более осторожным набором новшеств.