Skip to content

Civil War

September 23, 2026

I recognise that it might be a bit dramatic to say that CppCon involved a civil war… but it is quite apt. Additionally, I wasn’t the one to coin this term. John Lakos referred to this whole situation as a “Civil War” during the Q and A section of Bjarne’s opening keynote. So I feel justified in also naming it as such.

So what is going on??

The Premise

This entire situation is centred around Contract assertions. Yes, basically check in Unreal Engine or <cassert> in the standard library. That is what this is all about. Mad right? The following is my understanding of what is going on here after talking to A LOT of people about this from various perspectives.

At the C++ meeting in Croydon in March 2026, the C++26 working draft was finalized with Contracts in it after being voted in, in February 2025. Contracts has an exceptionally storied history. All of the gruesome details can be found in this talk and the timestamp in the link Making C++ Safe, Healthy, and Efficient - John Lakos - CppCon 2025. It has been removed from the standard once before in the C++20 working draft. So it did pretty well to stay in until the draft was finalized this time. However, the finalization vote was not unanimous. There was a group of people who very clearly did not agree to putting contracts in the standard. Among this group of people is Bjarne Stroustrup.

Bjarne’s Keynote

Bjarne has made it quite clear what he thinks of Contracts, and he reiterated that feeling in his opening keynote this year. “They are awful”.

Important

To clarify he likes the idea of contracts. He just really does not like the current implementation that got voted into the standard.

This is a sentiment that he offered as an answer to the first question after his keynote. After this answer, John Lakos jumps up and speaks rather candidly. John points out that there appears to be a “civil war” between the “Contracts” people and the “Profiles” people (more on Profiles later). John went on to say that he in no way wants that. He wants to meet people where they are at and work it out. These two features do not have to be in opposition.

So that was the kick-off. Contracts got into C++26. Bjarne and friends are not happy about it. John makes sure the whole conference is aware of this “Civil War” that is brewing, while offering an olive branch between the warring factions. And we are only at the Opening Keynote of the conference!

Profiles

Can profiles do better than contracts? Should we just wait for profiles? What are profiles? Gabi gave a great talk on them at BeCPP in March of this year (BeCPP Symposium 2026 - Gabriel Dos Reis - Tightening the Screws with C++ Profiles) and of course Bjarne’s keynote at CppCon was all about Profiles too (Profiles for Simplicity and Guarantees - Bjarne Stroustrup - CppCon 2026) Up until watching Bjarne’s keynote I was of the opinion that Profiles were basically “Make compiler warnings (and warnings as errors) part of the language”. However, if you look at the last bullet point in this slide….

Bjarne’s Profile strategy slide, including run-time checks

… you can probably see where the contention is. Profiles will make use of run-time checks where compile time checks are not possible. Run-time checks and violation handling are entirely what Contracts are all about! So it would appear that Profiles are wanting to compete with Contracts in this regard, and perhaps people don’t want two solutions to the same problem? I am not convinced by this though. I would imagine some run-time checks might be better off being expressed by profiles and some by contracts. Or perhaps Profiles really should just stick to the compile time checking and let run-time checks be a thing that Contracts handle. I can see now why this whole situation might benefit from just getting people into a room and discussing how Profiles and Contracts could live in a world together, rather than people just trying to torpedo Contracts.

Why not Contracts?

Throughout the conference, I then tried to figure out what people dislike about contracts. And 2 common themes came up:

  1. Constification -> Contract assertions should not produce any side-effects. Why? What happens when you write check(i++) in Unreal? That variable no longer gets incremented in Test and Shipping builds because checks are compiled out in those configurations. That’s a problem. Constification tries to stop most of the issues that stem from this problem by treating objects as const within a contract expression, even if the object is not const outside of it. So if you try to call a member function that is non-const through a constified object in a contract assertion, you will get a compile error.
  2. “We want Eiffel contracts” -> There are contracts in other languages. And many people want C++ contracts to work exactly like contracts in those languages. Timur gives a really good rundown of what these languages do and why what they do would not be a good idea for C++ from this time stamp Contract Assertions on Virtual Functions - Timur Doumler - ACCU 2026

Those opposed to contracts will typically quote these two issues that they have. The convenient thing about not liking constification is that many mechanisms in contracts depend on that particular feature, so removing it would require removing/redesigning other parts, and before you know it, you are right back to square 1 in terms of designing contracts. And after watching Timur’s talk, I am inclined to think that the whole “Eiffel” talking point is silly. I firmly believe that there aren’t many people in the world that have given this design problem as much thought and research as all of those people involved with designing C++ contracts. The amount of scrutiny that they have been under since their first conception in 2003 is incredible.

The DIS

So what is next then? There is an upcoming “DIS Ballot”. The DIS is where countries vote on if a new draft standard (C++26 in this case) will be formally accepted as the new standard. It is effectively the final hurdle in standardization. There has NEVER been an issue with C++ at this stage of the process before. Never a doubt. But not this year. There is a chance that C++26 will fail this vote.

How?

There is a group of people who are contacting voting delegates to vote against the DIS. This core group of people are so annoyed that contracts made it into C++26 that they are willing to just throw away the entire standard. “If we can’t get contracts out of C++26, then no C++26 for you” is basically the crux of it. And I am quite excited for 26… Reflection is awesome! So this would be quite a blow indeed.

“What happens if a standard fails the DIS ballot?” The following are some of the responses when I asked this question:

  1. “I don’t know. It’s never happened before.”
  2. “Undefined behaviour”
  3. “Anything from there not being a C++26, to a complete revision, or perhaps just a large fallout of the standardization process”

From this I gathered that people were a little scared of this potential outcome, and what it might mean for C++ in general. Others were clearly fed up with the whole situation. What was clear was that no one was happy. This was and is a serious situation.

Wrapping up

And so there you have it. A Civil War is brewing in C++. There are some big names involved on both sides. The DIS Ballot closes on 23rd October, and regardless of whether it succeeds or fails, it might change the course of C++… If the DIS succeeds, will we see people rage quit from the committee? If the DIS fails, will we see people leave because they have become disillusioned and burned out? Or will nothing happen? Who knows, but I am biting my nails a little bit… I really would like reflection please :)

Last updated on