4 ноября opennet сообщил, что национальные комитеты ISO не утвердили стандарт C++26. Голосование по финальному черновику (DIS) закончилось 22 октября, и такого с основным стандартом C++ ещё не случалось: с 1998 года эта стадия проходила как формальность.
Для тех, кто пишет на C++, пока ничего не ломается. Компиляторы уже поддерживают многое из C++26 по флагам, и откатывать код не нужно. Под вопросом сроки выхода стандарта и судьба одной фичи: контрактов.
12 из 20 «за» при нужных двух третях
Чтобы DIS прошёл, нужны два условия: не меньше двух третей голосов «за» от комитетов с правом голоса (P-members) и не больше четверти голосов «против» от всех проголосовавших. Воздержавшиеся не считаются. По данным Роберта Сикорда, руководителя комитета по языку C, «за» проголосовали 12 комитетов из 20 (60%), «против» 9 из 22 (41%). Провал по любому из условий уже означал бы отказ.
Против, как пишет Матеуш Пуш из польского комитета, голосовали Дания, Финляндия, Иран, Италия, Япония, Люксембург, Румыния, Испания и Швеция. Польша и США воздержались. Официальный протокол ISO доступен только делегатам, так что список приводится с его слов.
Камень преткновения: pre, post и contract_assert
Причина в контрактном программировании. В C++26 добавили предусловия pre, постусловия post и проверку contract_assert. Контракты чуть не попали ещё в C++20, но их убрали в последний момент. Нынешний вариант развивают с 2019 года, и в WG21 за него проголосовали больше двух третей участников.
Несколько национальных комитетов сочли фичу сырой. По словам Андреаса Фертига, это прямо видно из их комментариев, а Дерек Джонс в блоге The Shape of Code пишет, что большинство «против» превратится в «за», если контракты убрать из черновика. Сами тексты комментариев публично пока не выложены.
Спор ещё и о правилах игры. Обычно комитеты соглашаются с компромиссами, достигнутыми в рабочей группе, и голосуют против только из-за новых недочётов или процедурных ошибок. На этот раз, как пишет opennet со ссылкой на члена комитета из Германии, звучали доводы, которые WG21 уже разбирала и отклоняла. Сторонники контрактов в документе P4433R0 «Do not remove Contracts from C++26» (Тимур Думлер, Джошуа Берн и ещё 14 соавторов) прямо говорят, что несколько человек во время голосования агитировали комитеты против, в том числе через публичную петицию.
Что дальше: встреча в Бузиусе 16 ноября
Директивы ISO после проваленного DIS дают четыре пути, их перечисляет документ P4388R0:
- исправленный черновик на новое голосование, уже на 8 недель;
- возврат на стадию проекта комитета с новым сбором замечаний;
- выпуск в виде технической спецификации, а не стандарта;
- отмена проекта.
Решает председатель SC22, WG21 даёт рекомендацию. Рабочая группа соберётся в Бузиусе (Бразилия) с 16 по 21 ноября. Лагеря понятны: авторы P4433R0 хотят снова отправить C++26 на голосование без изменений, а противники предлагают убрать контракты и сохранить остальное. Если пойдут по второму пути, новый черновик, по оценке Джонса, отправят на голосование весной или летом 2027 года, и стандарт выйдет не раньше третьего квартала 2027.
Итог: C++26 застрял на последнем этапе из-за одной фичи. Рефлексия, std::execution и остальное никуда не делись, но с датой выхода и с самими контрактами всё решится только после встречи в Бузиусе.

