Проект стандарта C++26 провалил голосование ISO: 12 «за», 9 «против»

Проект стандарта C++26 провалил голосование ISO: 12 «за», 9 «против»

Проект стандарта C++26 не прошёл голосование DIS (Draft International Standard, проект международного стандарта) в ISO. Голосование закрылось 23 октября 2026 года; результат на следующий день опубликовал в LinkedIn Robert Seacord, председатель (convenor) комитета по языку C. Автор блога, член польского национального органа, пишет, что, насколько ему известно, это первый проект C++, проваливший такое голосование. Seacord, по его словам, не считает, что хоть один языковой стандарт SC22 когда-либо проваливал голосование, а Daveed Vandevoorde из Direction Group (руководящей группы) WG21 написал, что ни один прежний проект C++ не получил даже одного голоса «против». В непринятом проекте оказались рефлексия, std::execution, усиление (hardening) стандартной библиотеки и контракты; насколько затянется задержка, пока никто не знает.

Проект не выполнил оба условия принятия. Для двух третей из 20 нужно 14 голосов «за», а набрано 12. Четверть от 22 допускает пять голосов «против», а получено девять. Любого из двух провалов хватило бы для отклонения. «Против» проголосовали Дания, Финляндия, Иран, Италия, Япония, Люксембург, Румыния, Испания и Швеция, и каждая приложила комментарии. Франция и Ирландия воздержались, но тоже прислали комментарии, так что всего комментировали 11 стран. Воздержались также Польша и США.

Сами комментарии пока недоступны. По директивам ISO/IEC (пункт 2.6.5 части 1) полный отчёт с результатом, решением председателя комитета и полным текстом комментариев должен выйти в течение 12 недель после конца голосования, то есть не позднее середины января 2027 года. На стадии комитетского проекта WG21 публиковал такой отчёт как N5028; повторит ли это сейчас, автор не знает. Автор ожидает, что все девять голосов «против» относятся к контрактам, но уверенно это станет известно лишь после публикации комментариев. Основания для ожидания: оба возражения на пленарном заседании в Кройдоне, отправившем C++26 на голосование, касались контрактов; несколько комментариев национальных органов к комитетскому проекту требовали их убрать; а P4238R1 призывал национальные органы голосовать «против» из-за дизайна контрактов и того, как он проходил через комитет.

О позиции Польши: её решает технический комитет KT 331 Польского комитета по стандартизации. Вопрос ставился так: отклонить ли DIS и отправить в ISO технические комментарии. Голосование не набрало нужного, поэтому Польша объявила «воздержание», а комментарии к нему приложить было нельзя. Автор не раскрывает ни подсчёта, ни кто как голосовал. Он добавляет, что за несколько дней до конца польского голосования не хватало голосов для кворума: часть людей из списка сменила работу, а письма некоторым «молчунам» возвращались. Вывод автора: члены национальных комитетов должны голосовать, а те, кто больше не участвует, просить исключить их из списка, потому что неактивный член учитывается в кворуме и мешает остальным его набрать.

Что дальше. Директивы предусматривают четыре варианта после проваленного DIS: разослать пересмотренный проект для запроса (enquiry draft) с голосованием восемь недель вместо двенадцати; разослать пересмотренный комитетский проект для комментариев; выпустить его как проект технической спецификации; закрыть проект. Один из первых трёх выбирает председатель SC22 вместе с секретариатом SC22 и convenor WG21 и после консультации с центральным офисом ISO/IEC. Только отмена требует решения SC22 в целом. Задача WG21, рассмотреть комментарии, рекомендовать курс и при необходимости подготовить пересмотренный проект. На момент написания автор не видел объявления о выбранном варианте.

Следующая встреча WG21 пройдёт в Бузиусе (Бразилия) 16-21 ноября 2026 года, первая встреча всего комитета после результата. Мнения разделились. Одни хотят добиваться нового голосования, не меняя и не убирая контракты: это предлагает формальное предложение P4433R0, которое также просит отклонять комментарии с требованием убрать контракты, если они не приносят новой технической информации, и подтвердить оба пункта опросом в Бузиусе. Другие считают решение простым: J. Daniel Garcia, один из авторов P4238R1, написал под постом Seacord, что краткосрочное решение, убрать одну проблемную возможность, после чего остальной стандарт, скорее всего, будет одобрен. Рекомендация Vandevoorde, по его словам, будет такой: убрать контракты из проекта, внеся поправки, чтобы сохранить hardening библиотеки. Часть прежних комментариев национальных органов просила вместо этого выпустить техническую спецификацию или white paper.

Свою позицию автор раскрыл после закрытия голосования: он любит контракты как идею, ценит и проверку (программа может сверять собственные допущения), и документирование (предусловие и постусловие в сигнатуре фиксируют замысел автора интерфейса и не «протухают», как комментарий), хочет их сохранить, но готов смириться с их уходом из C++26, лишь бы остальное вышло как можно скорее. Он преподаёт контракты C++26 в своих мастер-классах, а mp-units использует версию C++26. Сложнее вопрос, как улучшать дизайн дальше: возражения тянут в разные стороны (более сильные гарантии, проверяемые компилятором; больше логики в библиотеке; сначала техническая спецификация; проверки, которые нельзя отключить), и единой альтернативы, устраивающей всех, автор не видел.

Для кода сегодня: пока не выйдет новая редакция, действующий стандарт C++, ISO/IEC 14882:2024 (C++23). Компиляторы реализуют возможности из рабочего проекта, и голосование не меняет уже поставляемое. GCC 16 принимает -std=c++26, у Clang есть -std=c++2c; контракты в GCC 16 реализованы в рамках экспериментальной поддержки C++26, реализация в Clang не влита. Будут ли производители сохранять все возможности проекта под этим флагом, зависит от каждого, и обещать это никто не может. Тем, кто уже использует возможности C++26, ничего пока откатывать не нужно, но надо помнить, что реализованное сейчас, проект, и он может не совпасть с опубликованным стандартом.

Ключевые факты

  • Проект C++26 провалил голосование DIS, закрывшееся 23 октября 2026 года: 12 голосов «за» (нужно 14 из 20) и 9 «против» (допустимо 5 из 22), не выполнены оба условия.
  • «Против» голосовали Дания, Финляндия, Иран, Италия, Япония, Люксембург, Румыния, Испания и Швеция; Франция и Ирландия воздержались, но тоже прислали комментарии, Польша и США воздержались.
  • Автор блога ожидает, что все девять голосов «против» касаются контрактов; наверняка это станет ясно после публикации комментариев, не позднее середины января 2027 года.
  • Директивы ISO/IEC допускают четыре пути: пересмотренный проект для запроса (голосование восемь недель), пересмотренный комитетский проект, проект технической спецификации или отмена проекта; выбора пока не объявлено.
  • Встреча WG21 в Бузиусе (Бразилия) 16-21 ноября 2026 года: одни требуют нового голосования без изменений контрактов (P4433R0), другие предлагают убрать контракты и оставить hardening библиотеки.

Почему это важно

По словам автора блога, это первый случай, когда проект C++ провалил голосование DIS; Vandevoorde отмечает, что ранее ни один проект C++ не получал даже одного голоса «против». Вместе с контрактами в непринятом проекте остались рефлексия, std::execution и hardening библиотеки, и сроки их выхода как стандарта теперь неизвестны. Пока новая редакция не опубликована, действует ISO/IEC 14882:2024 (C++23).

Кому это важно

Разработчикам на C++, особенно командам, уже использующим или изучающим возможности C++26; авторам библиотек и интерфейсов, для которых контракты, способ документировать и проверять предусловия; производителям компиляторов (GCC, Clang); участникам национальных органов по стандартизации и WG21, которым предстоит решать судьбу контрактов и проекта в целом.

Как это применить

Ничего откатывать пока не нужно: голосование не меняет того, что компиляторы уже поставляют. GCC 16 принимает -std=c++26, у Clang есть -std=c++2c; контракты в GCC 16 экспериментальные, реализация в Clang не влита. Автор советует помнить, что реализованное сейчас, черновик, который может не совпасть с опубликованным стандартом. Тем, кто участвует в работе национального комитета, автор советует голосовать, а ушедшим из активной работы, попросить исключить их из списка голосующих, чтобы не мешать набору кворума.

Можно ли доверять

Материал, авторский блог члена польского национального органа; имя автора в тексте не названо. Результат голосования (12 «за», 9 «против», список стран) автор берёт из официального результата, опубликованного Seacord в LinkedIn. Заявление «первый провал», оценка автора («насколько мне известно») и слов Seacord и Vandevoorde. Связь голосов «против» с контрактами, ожидание автора, а не установленный факт. Личное отношение к контрактам автор раскрывает сам: он хочет их сохранить.

Риски и подводные камни

Текст комментариев национальных органов недоступен, поэтому что именно утверждали девять «против», неизвестно. Не объявлено, какой из путей выбран, и сроки задержки не названы. Неизвестно, что решит WG21 в Бузиусе, будет ли опубликован отчёт вроде N5028 и сохранят ли производители компиляторов все возможности проекта, включая контракты, под флагом C++26. Автор опасается, что отсутствие опыта промышленного применения контрактов вернётся как возражение при следующем голосовании.

«краткосрочное решение простое: убрать одну проблемную возможность, и остальной стандарт, скорее всего, можно будет утвердить»

— J. Daniel Garcia, один из авторов P4238R1, в комментарии под постом Robert Seacord