namespace cpp

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


modern_cpp

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)

"Klassisches" C++98 hatte lange Bestand.2) Der Sprachstandard wird seit 2011 im 3-Jahres-Rhythmus weiterentwickelt (siehe Zeitleiste). Aktuelle Compiler unterstützen "modernes" C++113), C++144), C++175), C++206) zunehmend. Technische Spezifikationen (TS) und andere Vorschläge können in den Entwurf von C++2b oder später einfließen. Die folgenden Listen sind unvollständig und in ihrer Reihenfolge subjektiv. Es gibt viel Neues zu lernen.

C++20

… our biggest nine-year-cycle yet … in terms of new features added.
— Herb Sutter7)
  • Module8) überwinden Probleme des #include-Mechanismus. import-Anweisungen beschleunigen das Übersetzen, übergangsweise auch import <iostream>; P0581 schlägt vor, die Standard-Bibliothek zu modularisieren.
  • <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 noch in der Bibliothek10).
  • <format>: typsichere, schnelle und flexible Aufbereitung von Ausgaben: std::format("C++{}", 20)
  • <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 ergänzen die Möglichkeiten zur nebenläufigen Verarbeitung.
  • <bit>: Bits zählen, rotieren, bit_cast<T>(), <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(value); success) use(it);

C++14

…completes C++11.

C++11

It feels like a new language.
— Bjarne Stroustrup

Technische Spezifikationen

Die englischsprachige C++ Reference listet Technical Specifications (TS) und Entwürfe (PDTS/DTS = [Proposed] Draft Technical Specification) auf, darunter:

  • Networking (TS N4771) : Netzwerk-Sockets und IP-Protokolle. Einige (von mir nicht geprüfte) Beispiele finden sich hier.
  • Parallelism v2 (TS N4793) : Algorithmen und Typen für Parallelverarbeitung.
  • Reflection (TS N4856) : reflexpr greifen auf Namen und Eigenschaften von Typen und Variablen zu.
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)
Frei zugänglich: ISO C++ Working Draft (C++11 WD) = ISO Standard C++ 2011 + Bugfixes N3337 (2012-01-16).
4)
N3796. Frei zugänglich: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3797.pdf (2013-10-13).
Herb Sutter: We have C++14! (2014-08-18).
5)
Herb Sutter: C++17 is formally approved. (2017-09-06)
DIS N4660. Frei zugänglich: Working Draft N4659 (2017-03-21).
Thomas Köppe: Changes between C++14 and C++17 DIS. P0636R0 (2017-04-02)
http://stackoverflow.com/questions/38060436/what-are-the-new-features-in-c17 (2016-06-30)
6)
Bryce A. Lelbach: C++20 is done! (2020-02-15)
Herb Sutter: Trip report: Winter ISO C++ standards meeting (Prague) (2020-02-15).
DIS N4860. Frei zugänglich: Working Draft N4861 (2020-04-01).
Herb Sutter: C++20 approved. (2020-09-06).
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.
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.
10)
Bibliothek cppcoro nutzen oder selbst programmieren, siehe P2168R0. 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.txt · Zuletzt geändert: 2020-09-18 16:57 von rrichter