C++26 не прошёл голосование ISO: национальные комитеты против контрактов

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 и остальное никуда не делись, но с датой выхода и с самими контрактами всё решится только после встречи в Бузиусе.

Источники и ссылки


Комментарии загружаются…