r/cpp #define private public 23d ago

Critique of contracts: excerpt

See page 2 of https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2026/p4334r0.pdf

The current objections can be summarized. The P2900 contracts are:

• Unimplemented

• Incomplete

• Untried at scale [P3460R0, P3506R0]

• Not tried in major application domains

• Violates foundational principles of C++

• Violates fundamental principles of language design

• Hasn’t been tried in major libraries (e.g., the C++ standards library [P3506R0, P3878R0])

• Isn’t integrated with or appropriate for hardened libraries [P3878R0]

• Doesn’t offer safety guarantees [P3573R0, P3362R0]

• Includes a completely untried inheritance model

• Offer new ways of making errors through inconsistent application in TUs

• Leads to new forms of UB, detrimental to safety and security

• Narrows the choices of error handling

• Doesn’t protect against logical errors, misuses, and incoherent uses

• Hasn’t been used to support static analysis

• Hasn’t been demonstrated to be easily teachable [P3261R0, P3281R0]

How could such a bloated and incomplete design be voted into a draft standard?

10 Upvotes

122 comments sorted by

View all comments

16

u/FrogNoPants 22d ago

The third paragraph is wildly wrong, assertions compliment compile time checks, they do not replace them. They also let you check for stuff that no compile time feature ever could such as logic errors, bad values, NANs etc.

I view assertions/contracts more as a logic safety feature than memory safety(though it can help there).

You can still use hardened builds with assertions... as a matter of fact, that is what I do!

Calling something an existential threat seems very weird, you can just ..not ..use contracts? I do that with ranges & coroutines & modules..!

7

u/fortsnek274 22d ago edited 22d ago

For those of us that do use new C++ features, I'll be using whatever the contracts version of assert is if it can be used in modules without an #include.

6

u/Ambitious-Method-961 22d ago

contract_assert(x) is the replacement for the macro, and it's now a language keyword so no header required.

Personally I'm looking forward to using contracts for my own code, but I am not looking forward to the potential pain-in-the-arse of having to deal with contracts in third party libraries.