C++26 scheitert an ISO-Abstimmung über Contracts, getestet in GCC 16
C++26 ist an der ISO-Abstimmung über Contracts gescheitert. Ein Test von Tech AI Wire prüfte alle vier Modi in GCC 16.2; einer gab für 10 / 0 ohne Warnung 0 aus.
Von Claire Whitmore
4 Min. Lesezeit
Maschinell übersetzt aus dem englischen Original, das Claire Whitmore auf Fakten geprüft und redigiert hat. Es gilt die englische Fassung. So arbeiten wir
Die Zahlen
- nationale Gremien stimmten gegen den C++26-Entwurf
- 9
- Beginn des WG21-Treffens in Búzios, Brasilien
- 16. Nov.
- Contract-Modi bietet GCC 16, alle hier getestet
- 4
Der Entwurf von C++26, der nächsten Version des C++-Sprachstandards, ist im Oktober 2026 an seiner ISO-Abstimmung gescheitert. Der Streit dahinter dreht sich um ein einziges Feature: Contracts. Das C++-Komitee, WG21 genannt, trifft sich vom 16. bis 21. November in Búzios, Brasilien. Dort entscheidet es, ob das Feature gestrichen, ausgelagert oder erneut zur Abstimmung gestellt wird. Das Ergebnis entscheidet, ob C++-Programmierer Contracts in diesem Standard überhaupt bekommen.
Was bei der C++26-Abstimmung passiert ist
Abgestimmt wurde über den Draft International Standard, die letzte vollständige Abstimmung, bevor ISO einen Standard veröffentlicht. Das Normungsgremium jedes Landes stimmt ab. The Register meldete 13 Ja-Stimmen, 9 Nein-Stimmen und 12 Enthaltungen. ISO erlaubt höchstens 25 % Nein-Stimmen.
Andere Berichte nennen eine leicht abweichende Zählung. Ein Blogbeitrag von Mond und eine Analyse von HFT University stützen sich beide auf Zahlen, die Komiteemitglied Robert Seacord veröffentlicht hat. Danach stimmten 12 von 20 stimmberechtigten Mitgliedern zu, weniger als die 14 für eine Zweidrittelmehrheit nötigen. Außerdem stimmten 9 von 22 Gremien mit Nein, erlaubt sind höchstens 5. HFT University weist darauf hin, dass das offizielle Ergebnis noch nicht öffentlich ist. Seacords Beitrag sagte es deutlich: "Die Abstimmung über C++26 ist abgeschlossen. Leider wurde sie abgelehnt."
HFT University nennt die Länder, die mit Nein stimmten:
| Stimme | Länder |
|---|---|
| Nein | Dänemark, Finnland, Iran, Italien, Japan, Luxemburg, Rumänien, Spanien, Schweden |
| Enthaltung mit Kommentaren | Frankreich, Irland |
| Enthaltung | Polen, Vereinigte Staaten |
Warum nationale Gremien gegen Contracts stimmten
Mit Contracts kann ein Programmierer Prüfungen direkt in die Deklaration einer Funktion schreiben. Eine Vorbedingung, geschrieben pre, sagt, was beim Aufruf der Funktion gelten muss. Eine Nachbedingung, geschrieben post, sagt, was bei ihrer Rückkehr gelten muss. Eine contract_assert-Anweisung prüft etwas mitten im Code.
Bjarne Stroustrup, der Erfinder von C++, führt die Gegner an. "Die P2900-Contracts und ihre Erweiterungen zielen darauf ab, das Wesen von C++ zu verändern, und sind eine existenzielle Bedrohung für C++", sagte er laut The Register. Andreas Fertig, ein Komiteemitglied, verteidigte das Design: "An dem Thema wurde jahrelang gearbeitet, und es hat in seiner jetzigen Form mehrfach eine Mehrheit erhalten."
Monds Analyse zufolge forderten Gremien aus mindestens sieben Ländern Änderungen, die abgelehnt wurden. Einige wollten Contracts entfernen. Andere wollten Prüfungen, die sich nicht abschalten lassen. Mindestens vier verlangten, dass die gehärtete Standardbibliothek, die Bibliothekscode um Sicherheitsprüfungen ergänzt, nicht von Contracts abhängt. Das Komitee behielt diese Kopplung bei.
Was WG21 in Búzios entscheiden kann
The Register nennt drei Optionen. WG21 kann Contracts streichen, damit der Rest von C++26 erscheint. Es kann Contracts in eine eigene Technical Specification verschieben, ein Begleitdokument außerhalb des Standards. Oder es nimmt eine kleine Überarbeitung vor und stimmt erneut ab.
Laut Mond vertreten zwei Papiere je eine Seite. P4433R0, "Do not remove Contracts from C++26", warnt, dass eine Streichung auch eine Neufassung des Textes zur Bibliothekshärtung erfordern würde. D4420, "Do Remove Contracts From C++26" von Vinnie Falco, argumentiert das Gegenteil. Verzögert sich der Standard, könnte sein formeller Name laut The Register ISO/IEC 14882:2027 lauten.
Getestet: C++26 Contracts in GCC 16
Die Statusseite von GCC führt Contracts ab GCC 16 als verfügbar. Die Statusseite von Clang sagt "No". In einem Test von Tech AI Wire unter macOS 26 mit GCC 16.2.0 in einem ARM64-Linux-Docker-Container rief ein kleines Programm safe_div(10, 0) mit dieser Prüfung auf:
int safe_div(const int a, const int b)
pre(b != 0)
post(r: r * b <= a)
{
return a / b;
}
Jeder Build nutzte g++ -std=c++26 -fcontracts -O2 plus einen Modus von -fcontract-evaluation-semantic=:
| Modus | Was bei safe_div(10, 0) passierte | Exit-Code |
|---|---|---|
enforce (Standard) | Gab die Verletzung aus und brach dann ab | 134 |
observe | Gab die Verletzung aus, lief weiter, gab 0 aus | 0 |
quick_enforce | Brach ohne Contract-Meldung ab | 134 |
ignore | Keinerlei Prüfung; gab 0 aus | 0 |
Die Builds mit ignore und observe gaben beide 0 für 10 geteilt durch 0 aus, eine sinnlose Antwort. Der Verletzungsbericht nennt Datei, Zeile und Bedingung: contract violation in function int safe_div(int, int) at contracts.cpp:4: b != 0.
Zwei Build-Fehler sind wissenswert. Der erste Versuch nutzte einfache int a, int b, und GCC lehnte ab: "a value parameter used in a postcondition must be const" (ein Wertparameter in einer Nachbedingung muss const sein). Ein Build mit -std=c++26, aber ohne -fcontracts, kompilierte. Dann scheiterte er beim Linken mit einer undefinierten Referenz auf handle_contract_violation.
Der Test zählte auch die Maschinenbefehle der kompilierten Funktion, nur mit der Vorbedingung. Ein handgeschriebenes if (b == 0) std::abort(); brauchte 6 Befehle. quick_enforce brauchte 11 und enforce 15. Mit zusätzlichem -fno-contracts-conservative-ipa sanken sie auf 6 und 9. Laut GCC-Dokumentation steuert diese Option, ob der Compiler über Inline-Funktionskörper hinweg optimieren darf. HFT University meldete dasselbe Muster auf x86-Prozessoren.
Was das für Entwickler bedeutet
Planen Sie noch keine Codebasis um Standard-Contracts herum. Das Feature kann in Búzios gestrichen, verschoben oder geändert werden, und der Bericht von WG21 nach dem 21. November wird sagen, was davon. Code, der heute für GCCs -fcontracts geschrieben wird, könnte Änderungen brauchen.
Wer GCC 16 trotzdem testet, sollte den Modus bewusst wählen. ignore und observe lassen eine fehlgeschlagene Prüfung weiterlaufen. Sie eignen sich daher für Logging, nicht für Sicherheit. Markieren Sie Parameter als const, wenn eine Nachbedingung sie liest. Vergleichen Sie quick_enforce in Ihren eigenen Hot Paths mit einem einfachen if, bevor Sie seinen Kosten trauen. Wenn Sie auf die Bibliothekshärtung setzen, beobachten Sie, ob sie nach dem Treffen an Contracts gekoppelt bleibt.
Quellen
- C++26 stumbles at finish line over Contracts dispute - The Register
- For the first time, a C++ standard failed to pass the national bodies - Here Comes The Moon
- C++26 Failed Its ISO Ballot. In GCC 16, an Enforced Contract Optimizes Worse Than an if - HFT University
- C++ Standards Support in GCC - GCC
- Options Controlling C++ Dialect - GCC
Ähnliche Artikel

.NET 11 bringt Union-Typen in C# 15; Support für .NET 8 und 9 endet
.NET 11 und C# 15 erschienen am 10. November, dem Tag, an dem der Support für .NET 8 und 9 endete. Im Praxistest gab ein fehlender Union-Fall nur eine Warnung und stürzte dann ab.

CPythons JIT soll nach dem Rückzug von PEP 836 entfernt werden
Die Autoren von PEP 836 haben den Vorschlag am 19. Oktober 2026 zurückgezogen. Daher dürfte der experimentelle JIT-Compiler von CPython nun aus dem Main-Branch entfernt werden.

Zig 0.17.0 bringt ein geteiltes Build-System und schnelle Rebuilds
Zig 0.17.0 erschien am 2. Oktober mit 925 Commits von 206 Beitragenden: ein überarbeitetes Build-System, inkrementelle Builds unter x86_64 Linux und LLVM 22.1.8.