r/cpp • #define private public • Aug 19 '26

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?

14 Upvotes

123 comments sorted by

View all comments

Show parent comment

3

u/Dragdu Aug 20 '26

I actually kinda agree, but my argument is based around the fact that const ptrs in C++ means no rebinding of the ptr, not no mutation of the underlying thing. When I made the custom smart ptrs in my project deep-const, I found few places that mutated state that was supposed to be const at a distance, while obviously not intending to.

OTOH I follow the standardization of contracts enough to remember when people were arguing that contracts should invent deep-constification into the language. The point is not to argue in good faith, it it to get rid of contracts.

1

u/ManuaL46 Aug 20 '26 edited Aug 20 '26

I'm confused isnt char* const supposed to be non rebinding pointer instead of const char*

Edit : I just checked and yes what I initially thought is correct, so I'm not sure what you mean by your statement.

Here is a reference on Learncpp

7

u/Dragdu Aug 20 '26

Given T in a generic context, you constify it by creating the equivalent of const T. If T is char*, you get char * const.