Голосование, которое остановило C++26
Путь C++26 к стандартизации столкнулся с беспрецедентным препятствием 24 октября 2026 года. Черновик не прошел голосование по ISO Draft International Standard (DIS), что стало первым случаем в истории, когда стандарт C++ был отклонен на этой критической стадии. Это голосование по принципу «все или ничего» требовало от национальных органов одобрения всего черновика целиком, а не отдельных функций.
Результаты голосования были суровыми: среди участвующих членов только 60% (12 из 20) проголосовали «за», что меньше требуемого большинства в две трети. Кроме того, 9 из 22 национальных органов проголосовали «против», превысив допустимый 25-процентный лимит и достигнув тревожных 41%. Это не было отменой C++ или полным отказом от всех функций C++26; это был решительный отказ от всего пакета, вызванный глубокими разногласиями по поводу одного спорного предложения.
Этот результат подтверждает, что национальные органы — не просто формальность. Отклонение означает, что стандарт C++26 в текущем виде не будет принят. Сообщество теперь стоит перед сложной задачей переоценки и пересмотра черновика, что может значительно задержать выпуск.
Contracts стали камнем преткновения
Contracts, предложенные проверки времени выполнения для C++26, стали неоспоримой причиной провала. Эта функция, подробно описанная в P2900, была направлена на внедрение встроенных предусловий, постусловий и утверждений (assertions) непосредственно в язык, позволяя разработчикам определять ожидаемые состояния и поведение программы.
Это не было незначительным дополнением; одни только Contracts увеличили черновик стандарта примерно на 56 страниц. Предложение определяло четыре режима оценки, зависящих от реализации: ignore, observe, enforce и quick-enforce. Эта гибкость, задуманная для адаптации к различным сценариям развертывания, вместо этого вызвала значительное сопротивление.
Критики, включая создателя C++ Бьёрна Страуструпа, рассматривали Contracts как масштабный, незавершенный проект, полный опасностей. Они утверждали, что это вносит ненужную сложность, новые пути для неопределенного поведения (undefined behavior) и фундаментальный проектный изъян: проверки времени выполнения, которые могут быть (и, вероятно, будут) отключены в производственных сборках. По их мнению, это подрывает основной принцип C++ «zero-overhead» и предлагает решение из 1980-х годов для проблемы, которую лучше решать с помощью современного статического анализа.
Почему создатель C++ присоединился к оппозиции
Бьёрн Страуструп, создатель C++, не просто невзлюбил Contracts; он помог возглавить борьбу против них. В августе Страуструп и четыре соавтора — Дж. Дэниел Гарсия, Винни Фалько, Джон Спайсер и Вилле Вутилайнен — опубликовали P4334R0, «P2900 Contracts' Fundamental Flaws». В этом документе предложение было названо «экзистенциальной угрозой для C++», а его подход был охарактеризован как «подход 1980-х годов, игнорирующий около 50 лет прогресса».
Разрыв в фундаментальном дизайне очевиден. Критики, включая Страуструпа, выступают за последовательный статический анализ и надежные гарантии безопасности, утверждая, что проверки только во время выполнения нарушают принцип C++ «zero-overhead», так как они исключаются из производственных сборок. Они также утверждали, что предложение вводит новые риски неопределенного поведения и непроверенные модели наследования.
Сторонники, однако, рассматривают Contracts времени выполнения как практичный, немедленно полезный инструмент для выражения и проверки предположений программы — необходимую функцию для современной разработки. Для дальнейшего ознакомления с предложением см. P2900: Contracts for C++.
Контраргумент к опасениям Страуструпа по поводу «нулевых накладных расходов» не менее убедителен: работающий процесс стандартизации должен тщательно изучать предложение, а не просто формально одобрять компромисс комитета. Отклонение C++26 доказывает, что национальные органы проявляют бдительность, гарантируя, что новые функции соответствуют самым высоким требованиям, даже если это задерживает стандарт. Речь идет не только о Contracts; речь идет о целостности всего процесса стандартизации.
Нравится статья? Получайте такие каждое утро на почту.
одно письмо в день · отписка в два клика · без сторонних трекеров
Сопутствующий ущерб — и следующее решение
Принцип «все или ничего» при голосовании по C++26 означает, что Contracts не просто провалились в одиночку; они утянули за собой весь стандарт. Долгожданные функции, такие как static reflection и std::execution, теперь находятся в подвешенном состоянии. Этот сопутствующий ущерб — горькая пилюля для сообщества, жаждущего прогресса.
Этот тупик возник в то время, когда C++ сталкивается с растущим вниманием к вопросам повышения безопасности и надежности программного обеспечения. Конкурирующие языки, такие как Rust и Swift, предлагают гарантии безопасности памяти и надежные модели параллелизма, что оказывает давление на комитет по стандартам C++ с целью развития языка. Индустрия требует большего, чем просто производительность; она требует доказуемой корректности.
Теперь комитету предстоит выбрать сложный путь. Варианты включают рассмотрение комментариев национальных органов и решение возникших проблем или, что более радикально, полное удаление Contracts, чтобы спасти график. Возможно, появится более узкий компромисс, но окончательный путь и его сроки остаются крайне неопределенными. Это голосование доказывает, что одна функция действительно может задержать все остальное.
Часто задаваемые вопросы
Почему проект C++26 не прошел голосование ISO?
Проект не набрал необходимого порога одобрения и превысил допустимую долю отрицательных голосов. Разногласия по поводу предложения Contracts широко рассматриваются как главная причина.
Что такое Contracts в C++?
Contracts — это предлагаемые функции языка для выражения предусловий, постусловий и утверждений, которые могут быть проверены во время выполнения.
Были ли отклонены все функции C++26 в результате голосования?
Голосование охватывало весь проект стандарта, поэтому проект был отклонен в целом. Возражения, описанные в источнике, касались в основном Contracts, а не каждой функции C++26.
Что произойдет с C++26 после неудачного голосования?
Комитет должен рассмотреть комментарии национальных органов и решить, следует ли удалить Contracts, пересмотреть предложение или выбрать другой путь. Сроки выпуска остаются неопределенными.

