namespace cpp {}

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


modern_cpp

Dies ist eine alte Version des Dokuments!


Modernes C++

This is about computer mechanics… What happens when you take your favoured programming language and send it to the shop for a 60000 mile tune-up?
— Bjarne Stroustrup1)

Seit 2011 wird das „klassische“ C++982) im 3-Jahres-Rhythmus weiterentwickelt (siehe Zeitleiste). Aktuelle Compiler unterstützen „modernes“ C++11, C++14, C++17 (fast) vollständig und C++20, C++23, C++26 zunehmend. Technische Spezifikationen (TS) und andere Vorschläge können in den nächsten Entwurf (C++29) einfließen. Die folgenden Listen sind unvollständig und in ihrer Reihenfolge subjektiv.

C++26

C++ crossed a Rubicon: it handed us the keys to its own machinery.
— Herb Sutter3)
  • Static reflection
  • Unterstrich als Platzhalter für unbenutzte Variablen: auto [x,_,z] = f();
  • <contracts> : Vor- und Nachbedingungen, Zusicherungen
  • <debugging> : Breakpoints im Quellcode setzen, Debugger-Unterstützung
  • std::execution : Sender/Receiver-Modell für konkurrente und parallele Verarbeitung4)
  • <hive> : Container für Elemente, die häufig entstehen und verschwinden (inspiriert von plf::colony)
  • <linalg> : lineare Algebra mit BLAS-Funktionen
  • <simd> : Datentypen für parallele Datenverarbeitung
  • Ganzzahlen ohne Überlauf ("saturation arithmetic")
  • Zufallszahlengenerator std::philox_engine, std::ranges::generate_random()
  • std::views::concat, std::views::cache_latest

C++23

“Pandemic Edition” … not slowing down.
— Herb Sutter5)
  • import std; für Module der Standard-Bibliothek
  • <ranges>: Temporäre Werte in range-based for leben länger (P2644).
    • std::ranges::to<Container> (P1206)
    • std::views::enumerate6), as_const, as_rvalue, cartesian_product, chunk[_by], join_with, repeat, slide, stride, adjacent[_transform], pairwise[_transform], zip[_transform]
    • Algorithmen: iota(), shift_left(), shift_right(), starts_with(), ends_with(), contains(), fold()
  • std::generator<T> für Coroutinen
  • std::print() wirkt wie std::cout << format(), std::println(),
  • an Python angelehnte Ausgabe (P2286): std::print("{}", std::vector{1,2,3,1});[1, 2, 3, 1], std::print("{}", std::set{1,2,3,1});{1, 2, 3}
  • s.contains("C++") für string und string_view
  • std::mdspan: mehrdimensionale Feldindizes a[i,j]
  • std::expected<Result,Error> und std::optional<T> mit monadischen Operationen transform(), and_then(), or_else()
  • Quelltext in UTF-8, Unicode Annex 31 für Bezeichner: int 💩 = 23;
  • Literalsuffix (vorzeichenloser) size_t: for (auto i = 0zu, s = v.size(); i < s; ++i) …
  • cachefreundliche Container std::flat_[multi]map<K,V>, std::flat_[multi]set<T>
  • std::stacktrace hilft bei der Fehlersuche.

C++20

… our biggest nine-year-cycle yet … in terms of new features added.
— Herb Sutter7)
  • Module8) überwinden Probleme des #include-Mechanismus (Präprozessor, Makros). import-Anweisungen beschleunigen das Übersetzen, übergangsweise auch import <iostream>; Die Modularisierung der Standard-Bibliothek erfolgt erst mit C++23 (P0581).
  • <ranges> modernisiert <algorithm>, z.B. std::ranges::sort(v); kombinierbare Views filter(odd) | transform(sqr) | take(3) verarbeiten Wertfolgen „lazy“9).
  • Concepts beschränken Schablonen, ersparen SFINAE-Tricks, erleichtern den Compilern die Auswahl der passenden generischen Funktion und sorgen für hilfreichere Fehlermeldungen, falls v nicht sortierbar ist. Generische Funktionen mit auto-Parametern sind auch ohne den Vorsatz template … Schablonen.
  • <coroutine> verzahnt Prozeduren ineinander. Typen wie task<T> oder generator<T> fehlen leider noch10).
  • <format>: Typsichere, schnelle und flexible Aufbereitung von Ausgaben mit std::format("C++{}", 20) erleichtert die Internationalisierung.
  • <compare>: Drei-Wege-Vergleich mit dem "spaceship operator" a <=> b. std::rel_ops wird geächtet.
  • <barrier>, <latch>, <semaphore>, <stoptoken> und RAII-konforme std::jthread (joining threads) ergänzen die Möglichkeiten zur nebenläufigen Verarbeitung.
  • <bit>: Bits zählen, rotieren, bit_cast<T>(x) statt dem undefiniertem Verhalten von &reinterpret_cast<T*>(&x)
  • <numbers> : mathematische Konstanten $\pi$, $e$, $\sqrt{2}$ u.a.
  • <span> zeigt auf einen Bereich von aufeinanderfolgenden Elementen, ohne ihn zu besitzen (Zeiger und Anzahl der Elemente).
  • <syncstream> garantiert in nebenläufigen Prozessen Ausgaben ohne Wettrennen.
  • <version> ersetzt <ciso646> zur Versionserkennung, <source_location> löst __FILE__, __LINE__ etc. ab.
  • Typen char8_t, u8string, u8string_view für UTF-8-kodierten Unicode-Text, Methoden s.starts_with(…) und s.ends_with(…) für string und string_view
  • Initialisierungsteil in for (int i=0; auto e:seq) ... (enumerate?)
  • bezeichnete Struktur-Initialisierer struct A { int x,y,z; }; A a{.x=1, .z=3}; aus C übernommen
  • Funktionen
    • std::erase(container, value) anstelle von c.erase(std::remove(c.begin(), c.end(), value), c.end()) und
    • std::erase_if(container, predicate) statt c.erase(std::remove_if(c.begin(), c.end(), predicate), c.end()) für Container,
    • std::midpoint(a, b) und Interpolieren mit std::lerp(a, b, t) als a + t*(b-a) in <numeric>
    • std::shift_left(first,last,n) und std::shift_right(first,last,n) in <algorithm>

C++17

If you can look at a screenful of code and tell that it’s C++17, then we’ve changed the way we program C++.
— Herb Sutter11)
  std::pair p{1, 'a'};            // pair<int,char>
  auto [n, c] = p;                // structured bindings 
  for (auto [key, value] : mymap) /* ... */;
  if (auto [it, success] = mymap.insert({key, value}); success) use(it);

C++14

…completes C++11.

C++11

It feels like a new language.
— Bjarne Stroustrup
1)
Bjarne Stroustrup: C++0x Initialization Lists. Google Tech Talk (2007-02-21).
2)
ISO International Standard ISO/IEC 14882:1998(E) – Programming Language C++. (1989-09). „Bugfix“ C++03 (2003-10).
Technical Report on C++ library extensions. N1836, (2005).
3)
Herb Sutter: C++26 is done. Trip Report ISO C++ Meeting London Croydon (2026-03-29).
4)
Herb Sutter: ISO Trip Report St Louis (2024-07-02).
5)
Herb Sutter: C++23 Pandemic Edition is complete. WG21 Winter Meeting Issaquah Trip Report. (2023-02-13)
7)
Herb Sutter: Winter ISO C++ standards meeting (Kona) (2019-02-23).
8)
Compiler und Build-Infrastruktur erfordern Änderungen. Clang, Visual C++ und GCC experimentieren mit Modulen: Beispiel mit g++ 11, C++20 Modules Status Report.
9)
Von range-v3 wurde (bisher) nur eine kleine Auswahl übernommen. Wichtige, nützliche Bausteine wie action::sort, unique, enumerate, zip oder to<std::vector> fehlen. Siehe auch: rangesnext.
10)
Siehe P2168R0. Bibliotheken: cppcoro (basiert auf Boost), rangesnext, Visual C++ bietet <experimental/generator>.
11)
Herb Sutter: Oulu trip report (2016-06-30).
12)
„destructuring declaration“ in Kotlin, „destructuring assignment“ in Javascript, „tuple assignment“/„unpacking“ in Python
13)
> std::chrono::nanoseconds{7.2e18}. Die Mühlen des ISO-C++-Komitees mahlen langsam. To Sheldon Cooper: No sarcasm sign here.
modern_cpp.1774863913.txt.gz · Zuletzt geändert: von rrichter

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki