- C++26 ist offiziell technisch abgeschlossen. Enthalten sind vier Kernfunktionen: Reflection, verbesserte Speichersicherheit, Contracts und
std::execution
- Compile-Time Reflection ist die stärkste Abstraktions-Engine in der Geschichte von C++ seit der Einführung von Templates und ermöglicht es der Sprache, sich selbst zu beschreiben und Code zu erzeugen
- Bereits durch reines Neukompilieren bestehenden C++-Codes mit C++26 wird undefiniertes Verhalten (UB) durch nicht initialisierte lokale Variablen beseitigt, und mit der gehärteten Standardbibliothek wird Bounds-Sicherheit gewährleistet
- Bei der Ausrollung bei Google wurden nachweislich mehr als 1.000 Bugs behoben und die Zahl der Segfaults in Produktionsumgebungen um 30 % gesenkt
- Da GCC Reflection und Contracts bereits in den Trunk gemergt hat, wird eine schnelle Übernahme durch Compiler-Implementierungen erwartet
C++26 ist fertig: die wichtigste Veröffentlichung seit C++11
- Auf der Sitzung des ISO-C++-Komitees in Croydon, London, Großbritannien, wurden die technischen Arbeiten an C++26 endgültig abgeschlossen
- Rund 210 Teilnehmer (130 vor Ort, 80 remote via Zoom), offizielle Vertreter aus 24 Ländern
- Der Großteil der Sitzung war der Bearbeitung von 411 internationalen Kommentaren (CD-Phase) gewidmet, die im Sommer eingereicht worden waren
- Der Fokus lag auf Feinschliff, ohne neue Funktionen hinzuzufügen oder zu entfernen
- Das auf dieser Sitzung finalisierte C++26 tritt nun in die Phase der Erstellung der Enddokumente für die internationale Abstimmung zur Freigabe (DIS) ein
Die 4 Kernfunktionen von C++26
(1) Reflection
- Das größte Upgrade in der Geschichte der C++-Entwicklung seit der Erfindung von Templates: eine Funktion, mit der die Sprache sich selbst beschreiben und Code erzeugen kann
- Im Juni 2025 nahm das C++-Komitee Compile-Time Reflection in den C++26-Entwurf auf und markierte damit einen Wendepunkt in der Sprachgeschichte
- Sie wird beschrieben als „die leistungsfähigste neue Engine zur Ausdrucksstärke effizienter Abstraktionen, und es wird die nächsten zehn Jahre dauern herauszufinden, was diese Rakete leisten kann“
(2) Verbesserte Speichersicherheit
- Allein durch Neukompilieren wird in C++26 die gesamte UB-Kategorie des Lesens nicht initialisierter lokaler Variablen aus bestehendem C++-Code entfernt
- Die gehärtete Standardbibliothek (Hardened Standard Library) wird standardisiert und garantiert Bounds-Sicherheit für zentrale Typen wie
vector, span, string und string_view
- Der gemessene Performance-Overhead liegt im Mittel bei 0,3 % (unter 1 %)
- Bereits auf Apple-Plattformen und in Google-Diensten für Hunderte Millionen Codezeilen ausgerollt
- Ergebnisse der Google-Ausrollung:
- Mehr als 1.000 Bugs behoben
- Erwartet werden 1.000 bis 2.000 verhinderte Bugs pro Jahr
- 30 % weniger Segfaults in der gesamten Produktion
- Von Googles gesamtem C++-Code haben nur 5 Dienste vollständig opt-out gewählt, und nur 7 Stellen verwenden unsichere Zugriffs-APIs
(3) Contracts: pre, post, contract_assert
- C++26 führt Contracts auf Sprachebene ein — Unterstützung für Vorbedingungen (precondition), Nachbedingungen (postcondition) und Assertion-Anweisungen in Funktionsdeklarationen
- Wird als deutlich mächtiger als das
assert-Makro aus C eingeschätzt
- Abstimmungsergebnisse zur Einführung von Contracts:
- Februar 2025 (Merge in den Working Draft): 100 Ja, 14 Nein, 12 Enthaltungen
- März 2026 (endgültige Festlegung für C++26): 114 Ja, 12 Nein, 3 Enthaltungen
- Technische Bedenken einiger Komitee-Experten bestanden weiter, wurden jedoch in drei Sitzungen und zahlreichen Telefonkonferenzen ausführlich diskutiert
- Vor einer Sitzung vor November 2025 wurden nach Feedback zwei Bugs in der Contracts-Spezifikation behoben
(4) std::execution (Sender/Receiver)
- Das asynchrone Modell von C++: ein einheitliches Framework zum Ausdrücken und Steuern von Nebenläufigkeit und Parallelität
- Bietet Sicherheitseigenschaften, die das Schreiben von structured concurrency (streng geschachtelte Lebenszyklen bei Nebenläufigkeit) erleichtern und dadurch Data Races strukturell verhindern
- Hinweis: Die Dokumentation ist derzeit unzureichend, und die „fingers-and-toes“-Bibliotheken sind noch schwach, wodurch die Einführung schwieriger ist als bei anderen C++-Features
- Möglicherweise ist Unterstützung durch bereits erfahrene Experten nötig sowie das Schreiben von Adapterbibliotheken zur Anbindung bestehenden asynchronen Codes
Warum eine schnelle Übernahme von C++26 erwartet wird
- Das am stärksten nachgefragte Feature-Set seit C++11, da Reflection und Sicherheitsverbesserungen enthalten sind, die die meisten C++-Entwickler im Alltag nutzen werden
- Parallel STL, Concepts, Coroutines und Modules aus C++17, C++20 und C++23 hatten laut Einschätzung nicht für alle C++-Entwickler eine so breite Wirkung wie C++11
- GCC und Clang haben über die gesamte Entwicklung von C++26 hinweg bereits zwei Drittel der Features vorab implementiert
- GCC hat Reflection und Contracts bereits in den Trunk gemergt, eine Veröffentlichung steht aus
Die Arbeit an C++29 beginnt: stärkere Speichersicherheit
- Auf dieser Sitzung wurde auch der Zeitplan für C++29 verabschiedet, der den dreijährigen Release-Zyklus beibehält
- Als zentraler Schwerpunkt von C++29 wurde eine weitere Stärkung von Typ- und Speichersicherheit festgelegt
- Vorschläge zur weiteren Verringerung von undefiniertem Verhalten (UB) werden geprüft
- In SG23 (Safety & Security Subgroup) laufen Arbeiten auf Basis von Bjarne Stroustrups P3984 Typ-Sicherheitsprofil und dem allgemeinen Profil-Framework von Gabriel Dos Reis
- Oliver Hunt von Apple stellte P4158R0 „C++ Subsetting and Restriction for Memory Safety“ vor
- Ein Subset-of-Superset-Ansatz wurde auf mehr als 4 Millionen Zeilen Code von WebKit angewendet
- Berichtet wurde, dass damit „zahlreiche Klassen von Schwachstellen blockiert werden und die aktuelle Richtlinie die meisten früheren Exploits verhindert hätte“
- Das Thema Speichersicherheit wurde vertieft in einer Mittwochabendsitzung mit Teilnahme der Mehrheit des Komitees sowie in einer speziellen EWG-Sitzung am Freitagnachmittag mit rund 90 Teilnehmern diskutiert
- Die Quantities-and-Units-Bibliothek (P3045R7 „Quantities and units library“) ist in SG6 und SG18 zu LEWG (Main Library Evolution Subgroup) vorgerückt
Nächster Zeitplan
- Die nächsten beiden Sitzungen finden in Brünn, Tschechien (Juni), und in Búzios bei Rio de Janeiro, Brasilien (November) statt
- In beiden Sitzungen beginnen die Arbeiten zum Hinzufügen von Features für den C++29 Working Draft
- Bis zur nächsten Sitzung sind bereits zahlreiche Telekonferenzen der Subgroups angesetzt
7 Kommentare
zzz
Hacker-News-Kommentare
Es ist bedauerlich, dass Contracts in C++ in den Standard aufgenommen wurden
Es wirkt, als würde einer Sprache, deren Komplexität bereits an ihre Grenzen gestoßen ist, noch mehr Komplexität hinzugefügt
Selbst Bjarne Stroustrup bezeichnete dieses Feature als „unvollständiges und durch Ausschussarbeit aufgeblähtes Design“
Ich halte auch die vielen möglichen Risiken und Fallstricke des Features für nicht ausreichend gerechtfertigt
Aber niemand zeigte Interesse
Relevantes Material gibt es hier
Es ist ein zentrales Element, um wie in Ada oder Rust mit formaler Verifikation (proof assistant) integriert zu werden und dadurch statische Verifikation statt Tests zu ermöglichen
Ada Spark ist hier ein guter Bezugspunkt
Das erste Beispiel in der cppreference-Dokumentation ist ausgerechnet ein Sonderfall, der den Zustand verändert
Auch die Syntax ist nicht intuitiv
Zum Beispiel wäre eine Form wie
asserts_pre(num >= 0)viel klarer gewesen alspre(num >= 0)Aber offenbar wurde Kürze bevorzugt
Statt die Komplexität zu erhöhen, führt es eher die individuellen Implementierungen zusammen und verbessert die Interoperabilität
Ich würde eher sagen, dass Reflection mehr Komplexität hinzufügt
Als C#- und Java-Entwickler habe ich eine Frage
Ich würde gern wissen, welche Arten von Anwendungen man heute mit C++ baut
Man hört nur selten, welche konkreten Probleme damit tatsächlich gelöst werden
Die Neudefinition von „erroneous behavior“ bei nicht initialisierten Variablen ist interessant
Laut Standarddokument entstehen Laufzeitkosten,
und mit dem Attribut
[[indeterminate]]kann man wieder zu undefined behavior zurückkehrenWenn man wirklich nicht initialisieren will, muss man das explizit schreiben, etwa
int x = void;Aus Versehen schreibt man so etwas praktisch nie
[[indeterminate]]wieder zu UB (Undefined Behavior) zurückführt, ist fraglichManche Projekte werden weiterhin manuelle Initialisierung bevorzugen
[[indeterminate]]stoßen wird, ist das schrecklichAm Ende verschwendet man Zeit damit, die Bedeutung nachzuschlagen, oder ignoriert es später einfach
Das erinnert mich an meine Erfahrung mit Rust, wo zu viele Generics und Traits das Lesen des Codes erschwerten
Ich habe in den 90ern im C++-Team von Microsoft gearbeitet
Damals dachte ich, RTTI sei die Grenze dessen, was C++ als Reflection-System haben könne
Die heutige Entwicklung ist erstaunlich
Das Treffen in Croydon abzuhalten und niemanden gehen zu lassen, bis unterschrieben wurde, war eine ziemlich raffinierte Taktik
Dort möchte ich nie wieder arbeiten
Ich war neugierig auf den Stand der C++26-Implementierung in GCC und Clang
GCC hat reflection und contracts bereits in den Trunk übernommen, aber ich würde gern wissen, wie weit Clang ist
auf der GCC-Seite dagegen auf „yes“
Sie ist bereits im Compiler Explorer nutzbar und wird verwendet, um simdjson Reflection hinzuzufügen
Ich frage mich, ob die Änderungen am Modulsystem dieses Standards tatsächlich zu einer breiteren Nutzung führen werden
Genau dieser Punkt ist der Grund, warum Rusts Cargo C++ so klar überlegen ist
Dass man nicht mit einer einzigen Zeile wie
cargo addeine Abhängigkeit hinzufügen kann, entfremdet die neue GenerationWenn CMake Clangs zweistufiges Kompilierungsmodell übernimmt, würde sich die Build-Geschwindigkeit deutlich verbessern,
und erst dann würden Module wohl wirklich breit angenommen
Die Chancen, dass sie Mainstream werden, sind gering
Es kommen zu viele neue Features dazu, um noch mitzuhalten
Auch das Build-System ist ein Chaos, und Header-Dateien sollten inzwischen verschwinden
Das ist zwar off-topic, aber der Ausdruck „London Croydon“ klingt seltsam
Sagt man nicht normalerweise eher „Croydon, London“?
Bei der Reiseplanung wirkt es natürlicher, von der größeren zur kleineren Region zu lesen
Der Grund für „London, Croydon“ ist vermutlich, den Eindruck zu vermitteln, dass das Treffen „in London“ stattfand
„Croydon, London“ klingt eher nach „in Croydon am Rand von London“ und wirkt deshalb weniger schick — eine halb scherzhafte Deutung
Es gibt auch zynische Reaktionen nach dem Muster: „gerade noch rechtzeitig vor dem Ende der Sprache erschienen“
Wenn sich C++29 nur auf Qualitätsverbesserungen und das Überarbeiten bestehender Features konzentrieren würde, hätte die Community damit wohl keine großen Probleme
random()-Funktion bekämeBis ein C++-Standard in der Industrie tatsächlich übernommen wird, vergehen meist erst einmal mehr als fünf Jahre, bevor man ihn so langsam einsetzt … attraktiv ist es ja, aber irgendwie doch nur unerreichbar schnief
Anstatt für Speichersicherheit neue Funktionen hinzuzufügen, würde schon das Verhindern von Dangling Pointern oder veränderlichen Referenzen die Speichersicherheit erhöhen, aber stattdessen wird durch zusätzliche Features nur die Komplexität des Codes erhöht.
Ich habe mich mühsam auf Rust umgestellt, deshalb ist es ermutigend zu sehen, dass viele der Funktionen, auf die ich gewartet hatte, in den C++26-Standardentwurf aufgenommen wurden. Aber zurück zu C++ werde ich wohl trotzdem nicht wechseln ... haha
Zum Thema Packaging kommt bereits einiges von der CMake-Seite..
https://www.kitware.com/common-package-specification-is-out-the-gate/
Contracts sind wirklich die Funktion, auf die ich gewartet habe — endlich.