Sutter's trip report confirms the feature freeze and frames the simultaneous landing of contracts, static reflection, and std::execution as unprecedented in modern C++ history. Each feature was in development for nearly a decade, and getting all three into one release is presented as a major committee achievement.
The editorial emphasizes that landing even one of these decade-long features would be notable, and shipping all three in the same release is 'unprecedented in modern C++ history.' The synthesis frames this as a watershed moment for the language.
The editorial dedicates significant analysis to contracts, arguing they change how developers defend interfaces by replacing comments, macros, and assert() with first-class compiler-understood syntax. The incremental migration path — adding contracts to hot interfaces first — is highlighted as key to practical adoption.
The committee explicitly chose to defer pattern matching — long considered a companion to reflection — to C++29 rather than hold the release. This reflects a pragmatic philosophy of shipping mature features on schedule rather than bundling incomplete work.
The ISO C++ standards committee (WG21) met in London/Croydon, UK in late March 2026 and voted to finalize C++26. Herb Sutter — longtime committee chair and convener — published his trip report confirming that the feature set is frozen. The draft international standard (DIS) will now go through the ISO ballot process, with formal publication expected in late 2026.
C++26 ships three features that have each been in development for the better part of a decade: contracts, static reflection, and std::execution (the sender/receiver model for structured concurrency). Getting even one of these into a standard would be notable. Landing all three in the same release is unprecedented in modern C++ history.
The meeting also finalized a number of smaller but practically significant features, including `std::inplace_vector`, improvements to `std::format`, and various core language cleanups. The committee explicitly deferred pattern matching — long considered a companion to reflection — to C++29, choosing to ship what was ready rather than hold the release.
Contracts change how you defend your interfaces. C++26 contracts let you express preconditions, postconditions, and assertions as part of function declarations — not as comments, not as macros, but as first-class syntax the compiler understands. A function signature like `int sqrt(int x) pre(x >= 0)` makes the contract visible to tools, static analyzers, and the runtime. The committee spent years debating the evaluation semantics (what happens when a contract is violated?), and the final design gives implementations flexibility: contracts can be checked, assumed for optimization, or ignored, controlled by build mode.
For practitioners, this means you can start encoding invariants that previously lived in documentation or `assert()` macros. The migration path is incremental — you can add contracts to hot interfaces first and expand from there. The real payoff comes when static analyzers and sanitizers start consuming contract annotations, which turns your API surface into a machine-checkable specification.
Static reflection makes metaprogramming tractable. If you've ever written a C++ serialization library, an ORM layer, or an enum-to-string utility, you've felt the pain that reflection solves. C++26's `std::meta` facilities let you inspect types, members, enumerators, and function signatures at compile time using ordinary `consteval` code — no preprocessor hacks, no external code generators, no macro soup.
The practical implications are enormous. Consider JSON serialization: instead of maintaining a macro like `NLOHMANN_DEFINE_TYPE_INTRUSIVE(MyType, field1, field2, field3)`, you write a generic `to_json` that iterates over the members of any struct at compile time. Reflection eliminates an entire category of boilerplate that has driven C++ developers toward code generation tools and away from the language itself. Libraries like Boost.Describe, Magic Enum, and countless internal serialization frameworks become either unnecessary or dramatically simpler.
std::execution gives C++ a structured concurrency model. The sender/receiver framework (`std::execution`, formerly P2300) provides composable, value-oriented async primitives. Think of it as what `std::future` should have been: instead of fire-and-forget with blocking `.get()`, you build pipelines of work that compose, cancel, and propagate errors structurally.
This matters most for systems programmers building IO-heavy services, embedded schedulers, or GPU compute pipelines. The model is explicitly designed to work with heterogeneous execution contexts — you can compose work across thread pools, GPU queues, and network IO without losing type safety or error propagation. For teams currently using ad-hoc callback chains or rolling their own task systems, `std::execution` provides a standard vocabulary that tools and libraries can target.
Pattern matching was the most visible deferral. The committee had multiple competing proposals, and rather than force a design that might age poorly, they chose to defer to C++29. This is arguably the right call — pattern matching interacts deeply with reflection, and shipping reflection first lets the committee design pattern matching with real-world reflection usage data.
The committee also deferred several executor-adjacent proposals and some advanced reflection capabilities. The general philosophy this cycle was "ship what's proven, defer what's speculative" — a notable shift from the C++20 era, where modules and coroutines shipped with known implementation gaps.
Don't rewrite anything yet. Compiler support will arrive incrementally. GCC, Clang, and MSVC have been implementing features in parallel with standardization, but full conformance typically lags 12-18 months after the standard is published. Contracts and reflection are both complex features that touch the core of the compilation model.
Start with library features. `std::inplace_vector` (a fixed-capacity vector with no heap allocation) is immediately useful in embedded and performance-critical code and will likely be available in compilers before the headline language features. Similarly, `std::execution` has production-quality implementations available today (stdexec/libunifex) that closely track the final standard.
Audit your code generation. If your build system includes codegen steps for serialization, RPC stubs, or enum utilities, flag those as candidates for reflection-based replacement once compiler support lands. The migration won't happen overnight, but teams that identify their codegen surface area now will be positioned to simplify their builds significantly over the next two years.
Evaluate contracts for your API boundaries. Start by identifying your most-violated preconditions — the ones that generate the most bug reports or defensive runtime checks. Those are your first candidates for contract annotations. Even before compiler support is complete, the exercise of formalizing your API contracts pays dividends in documentation clarity.
C++26 is the most ambitious C++ standard since C++11 introduced move semantics and lambdas. It addresses three of the language's longest-standing gaps — safe API contracts, compile-time introspection, and structured async — in a single release. The committee's decision to defer pattern matching rather than ship it half-baked suggests a maturation of the standardization process itself. The C++29 cycle starts now, and the foundation that reflection and contracts lay will shape what's possible next. For practitioners, the message is clear: the language you'll be writing in two years looks meaningfully different from the one you're writing today.
The "erroneous behavior" redefinition for reads of uninitialized variables is really interesting: https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2024/p27...It does have a runtime cost. There's an attribute to force undefined behavior o
This is awesome. I've was a dev on the C++ team at MS in the 90s and was sure that RTTI was the closest the language would ever get to having a true reflection system.
> Second, conforming compiler and standard library implementations are coming quickly. Throughout the development of C++26, at any given point both GCC and Clang had already implemented two-thirds of C++26 features. Today, GCC already has reflection and contracts merged in trunk, awaiting release
Biggest open question is whether the small changes to the module system in this standard will actually lead to more widespread adoption
Top 10 dev stories every morning at 8am UTC. AI-curated. Retro terminal HTML email.
I am somewhat dismayed that contracts were accepted. It feels like piling on ever more complexity to a language which has already surpassed its complexity budget, and given that the feature comes with its own set of footguns I'm not sure that it is justified.Here's a quote from Bjarne,>