Skip to content
industry insights

C++26 зашел в тупик. Виновата одна функция

Долгожданный релиз столкнулся с борьбой за стандарты, последствия которой выходят далеко за рамки одного голосования комитета. Удивительно, как одна спорная функция может поставить под угрозу рефлексию, исполнители (executors) и весь график C++26.

Cassidy Wolfe
C++26 зашел в тупик. Виновата одна функция

Голосование, которое остановило 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, пересмотреть предложение или выбрать другой путь. Сроки выпуска остаются неопределенными.

Found this useful? Share it.

For builders

Want Stork to write one of these about your product?

Send us a URL. We use the product, form a view, and publish what we actually think — in 8 languages, labeled Sponsored, with no copy approval on your side. That last part is what makes it worth quoting.

See how it works$199 · AI tools & software only

Для билдеров

Эта страница работает на чужой инструмент.

Её читают AI-агенты. На неё приходят покупатели. Она отвечает на восьми языках и через MCP. У вашего инструмента может быть такая же — в эфире за 24 часа.