C++23: Der neue C++-Standard ist fertig

C++23 wird der nächste C++-Standard nach C++20 sein. Er bringt deutliche Verbesserungen für die Programmiersprache mit.

In Pocket speichern vorlesen Druckansicht 22 Kommentare lesen
Lesezeit: 6 Min.
Von
  • Rainer Grimm
Inhaltsverzeichnis

Auch wenn C++23 als nächster C++-Standard die Programmiersprache deutlich verbessert, ist es weniger bahnbrechend als C++98, C++11 oder C++20. Der neue Standard steht eher in der Tradition von C++17.

Modernes C++ – Rainer Grimm

Rainer Grimm ist seit vielen Jahren als Softwarearchitekt, Team- und Schulungsleiter tätig. Er schreibt gerne Artikel zu den Programmiersprachen C++, Python und Haskell, spricht aber auch gerne und häufig auf Fachkonferenzen. Auf seinem Blog Modernes C++ beschäftigt er sich intensiv mit seiner Leidenschaft C++.

Ende der 80er-Jahre gab es mehrere unabhängige C++-Implementierungen. Daher legten Bjarne Stroustrup und Margaret A. Ellis 1989 in ihrem Buch "The Annotated C++ Reference Manual" (ARM C++) den Funktionsumfang von C++ fest. Darüber hinaus erfüllte ARM C++ noch eine zweite, wichtige Aufgabe. Er bildete die Grundlage für den ersten ISO-C++-Standard ISO/IEC 14882:1998 (C++98). C++98 besitzt sehr wichtige Features: Templates, die Standard Template Library (STL) mit ihren Containern und Algorithmen, Strings und IO-Streams.

Mit C++03 (ISO/IEC 14882:2003) erfuhr C++98 eine technische Korrektur, die so marginal ist, dass ich sie auf meinem Zeitstrahl nicht berücksichtige. In der Community wird C++03, das C++98 einschließt, schlicht Legacy C++ genannt.

Technical Report 1 (TR1) ist zwar kein offizieller Standard, beschreibt aber viele Komponenten, die in den offiziellen Standard C++11 aufgenommen wurden. Die neuen Bibliotheken zu regulären Ausdrücken, Smart Pointern, Hash-Tabellen oder Zufallszahlengeneratoren basieren alle auf TR1 und somit auf den entsprechenden Boost-Bibliotheken. Das Boost-Projekt, das von Mitgliedern des C++-Standardisierungskomitees gegründet wurde, ist die eigentliche Ideenwerkstatt für die aktuellen Erweiterungen der C++-Bibliothek. TR1 enthielt 13 Bibliotheken. Lediglich die speziellen mathematischen Funktionen mussten bis C++17 warten.

C++11 steht für den nächsten C++-Standard. Wir nennen ihn schlicht Modern C++. Dieser Name steht auch für C++14 und C++17. C++11 besitzt viele Features, die fundamental die Art und Weise ändern, wie wir C++ programmieren. Zum Beispiel enthält C++11 die TR1-Komponenten, aber auch Move-Semantik, Perfect Forwarding, Variadic Templates, Lambdas oder constexpr. Das ist noch nicht alles: Mit C++11 besitzt C++ ein Speichermodell als die fundamentale Grundlage von Concurrency und eine Multithreading-Schnittstelle. Falls du neugierig bist, hier sind meine Artikel zum Speichermodell und zu Multithreading.

C++14 ist ein kleiner Standard. Mit Damit wurde C++ um Reader-Writer Locks, verallgemeinerte Lambdas und verallgemeinerte constexpr-Funktionen erweitert.

C++17 ist weder groß noch klein. Dieser Standard besitzt zwei herausragenden Features: die parallele STL und die Dateisystembibliothek. Über 80 Algorithmen der STL können nun mit einer sogenannten Ausführungsstrategie (execution policy) ausgeführt werden. Das heißt, dass ein Aufruf der Form std::sort(std::execute::par, vec.begin(), vec.end()) einen Hinweis für die C++-Implementierung darstellt, parallel zu sortieren. Zusätzlich lässt sich spezifizieren, ob die Sortierung sequenziell (std::execute::seq) oder vektorisiert (std::execute::par_unseq) ausgeführt werden soll. Entsprechend zu C++11 besaß Boost sehr starken Einfluss auf diesen C++-Standard. Boost erweiterte C++ um ein Dateisystem und die neuen Datentypen std::optional, std::variant und std::any. Dies sind meine Artikel zu C++17.

C++20 ändert die Art und Weise, wie wir C++ programmieren, ähnlich fundamental wie C++11. Das gilt insbesondere für die großen Vier: Ranges, Coroutinen, Concepts und Module.

Die Ranges-Bibliothek erlaubt es, die Algorithmen der Standard Template Library direkt auf den Container anzuwenden, sie auf unendlichen Datenströmen zu definieren und diese mit dem aus der Unix-Shell bekannten Pipe-Operator zu verknüpfen.

Mit Coroutinen unterstützt C++20 die asynchrone Programmierung. Damit werden sich in C++20 kooperatives Multitasking, unendliche Datenströme, Event-Schleifen oder auch Pipelines elegant umsetzen lassen.

Concepts sind eine Erweiterung von Templates von C++, mit denen sich semantische Kategorien für die Menge der zulässigen Datentypen definieren lassen. Dank Concepts wird das Anwenden und Definieren von Templates deutlich einfacher und ausdrucksreicher.

Module stellen eine deutliche Verbesserung zu Header-Dateien dar und versprechen viele Verbesserungen: Präprozessor-Anweisungen (Makros) eliminieren, bessere Compile-Zeiten erzielen und einfacher Pakete schnüren.

Meine Artikel über Ranges, Coroutines, Concepts, Module und C++20.

Derzeit (Juli 2023) ist C++23 inhaltlich fertig und steht zur endgültigen Abstimmung an.

C++23 bietet mit Deducing This eine kleine, aber sehr effektive Erweiterung Kernsprache an. Die Neuerung ermöglicht es, ähnlich wie in Python den implizit übergebenen this-Zeiger in einer Mitgliedsfunktionsdefinition explizit zu machen. Dank Deducing This werden einige komplexe Techniken in C++ wie CRTP (Curiously Recurring Template Pattern) oder das Overload Pattern zu einem Kinderspiel.

Die C++23-Bibliothek wird viele wichtige Ergänzungen erhalten. So lassen sich die Standardbibliothek direkt mit import std; importieren oder die C++20 Formatspezifikation direkt in std::print und std::println anwenden. Ferner erhalten wir aus Performancegründen flache assoziative Container wie std::flat_map.Letzteres lässt sich anstelle von std::map einsetzen. Die Schnittstelle std::optional wird aus Gründen der Komposibilität um eine monadische Schnittstelle erweitert. Der neue Datentyp std::expected hat bereits eine komponierbare Schnittstelle und kann einen erwarteten oder einen unerwarteten Wert zur Fehlerbehandlung speichern. Dank std::mdspan erhalten wir einen mehrdimensionalen Span. Schließlich ist std::generator die erste konkrete Coroutine zur Erzeugung eines Zahlenstroms. std::generator ist Teil der ranges-Bibliothek, die in C++23 signifikante Erweiterungen erfährt.

In meinem nächsten Artikel werde ich meine Reise durch C++23 mit Deducing This beginnen. Deducing This ist eine kleine, aber bedeutende Verbesserung in C++.

I'm happy to present my mentoring programs in one hour

Facts

  • When: Jul 12, 2023, at 9:00 AM - 10 AM (CET; UTC +02:00)
  • Register for the presentation: Subscribe via E-Mail
  • Get your invitation link: Jul 11

(rme)