short

The August 2026 C++ mailing, and the fight over contracts

· english· audience: working-cpp· AI-generated, reviewed by Filip Sajdak

The pre-Búzios mailing is out: 48 papers, and roughly a dozen of them are the same argument. If you read one thing from this batch, read the contracts dispute, because it is about whether a feature already in the C++26 working draft stays there.

The case against P2900

P4334R0 “P2900 Contracts’ fundamental flaws” (Bjarne Stroustrup, J-Daniel Garcia, Vinnie Falco, John Spicer, Ville Voutilainen) is the headline paper, and it is blunt: the design is “an existential threat to C++”. The objections run to a list of fifteen, among them that contracts are unimplemented at scale, incomplete because virtual functions and old-value capture are deferred to C++29, absent from any shipping production codebase, and not wired into the hardened standard libraries that already do production checking at around 0.3% overhead. The authors are careful to say they are not against contracts as an idea, only against this design.

Four companions push the same direction. P4332R0 argues contracts are the wrong tool for undefined-behaviour checks. P4347R0 proposes decoupling the two. P4324R0 sketches a smaller library-based alternative the authors say is already implemented and tested. P4238R0 asks for C++26 to go back for evaluation it is said to have skipped.

The case for

P3100R8 (Timur Doumler, Joshua Berne) continues the framework for systematically handling undefined behaviour, and P4277R0 is its 232-page implementation report, walking every instance of UB in the standard with notes on whether a runtime check is even possible. That paper also records the relevant poll. At Brno on 10 June, EWG approved the direction of P3100 at SF:16 F:15 N:6 A:2 SA:0, recorded as consensus.

The other number matters more. P4334 itself reports that the earlier poll to remove contracts from C++26 came out SF:9 F:8 N:3 A:19 SA:41, recorded as consensus against removal. So the committee has already decided this once. What the August papers argue is partly that the decision was wrong and partly that the process was: as P4334 puts it, “a numeric rule does not weigh the implementation responsibility behind a sustained objection”.

Worth keeping straight, because the papers blur it: P2900 contracts are in the C++26 draft now, while P3100’s UB framework targets C++29 and was deferred. They are two arguments wearing one coat.

Everything else

P3589R3 “C++ Profiles: The Framework” (Gabriel Dos Reis) and P4222R2 “An initialization profile” (Stroustrup) keep the profiles track moving, which is the other half of the safety story and the one Brno left unresolved.

P4340R0 (Barry Revzin) extends constant template parameter support by letting std::meta::reflect_constant be customised. That is reflection reaching into the same corner of the language that makes compile-time regex possible, and it is the paper to watch if you care about what can be a template argument.

P2806R5 “do expressions” (Revzin, Cardoso Lopez, Laine, Park) is on its fifth revision. P3817R0 proposes structured binding assignments, extending the feature that C++26 already let into conditions.

The ranges crop continues: views::slice, views::scan, views::take_last and views::drop_last, range-based searchers, and clear() for container adaptors. Two revisions touch things covered here before, bitmask enums reaching R1 and an mdspan paper on const-qualifying an accessor.

The through-line is that C++26 is not as finished as “C++26 is done” suggests. The draft has not had its final ballot, and a group including the language’s designer is using that window to argue a headline feature is not ready. Búzios decides.


Sources: August 2026 mailing · open-std papers index · polls quoted from P4334R0 and P4277R0.