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 Stroustrup 1)

Nach C++98 schlug "Technical Report 1" (TR1, 2005) einige Erweiterungen vor.2) Seit C++113) wird die Sprache nun im 3-Jahres-Rhythmus überarbeitet. Modernes C++144), C++175) wird von aktuellen Compilern zunehmend unterstützt (Zeitleiste). Technische Spezifikationen (TS) können in den Entwurf künftiger Standards (C++20 oder später) einfließen. Die folgenden Aufzählungen sind in ihrer Reihenfolge subjektiv und unvollständig.

C++11

It feels like a new language.
— Bjarne Stroustrup

C++14

…completes C++11.

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 Sutter6)
  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++20

… our biggest nine-year-cycle yet … in terms of new features added.
— Herb Sutter9)

Der Entwurf N4830 für C++20 ist abgeschlossen10).

Module (TS N4720) überwinden die Aufteilung in Header- (*.h) und Implementierungsdatei (*.cpp). Mehrere Quellen können eine logische Einheit bilden. Die Übersetzung großer Projekte wird schneller, #include durch import-Anweisungen für Module ersetzt. Übergangsweise (?) können C++-Header importiert werden: import <iostream>; P0581 skizziert, wie die Standard-Bibliothek künftig modularisiert werden könnte. Module erfordern einen Umbau der Compiler-Infrastruktur.11) Davon unabhängig sind die anderen Neuerungen:

  • <concepts> beschränken Schablonen, erleichtern Compilern die Auswahl der passenden überladenen Funktion, ersparen SFINAE-Tricks und sorgen für hilfreichere Fehlermeldungen.
  • <ranges> bieten Algorithmen Bereiche als Parameter an: std::ranges::sort(v); Über "Pipelines" gekoppelt, sind views jeweils für einen Wert nach dem andern ("lazy") ausführbar (Beispiel). Von ranges-v3 wurde (bisher) nur eine kleine Auswahl übernommen.
  • <format>: typsichere, schnelle und flexible Aufbereitung von Ausgaben: std::format("C++{}", 20)
  • <compare>: Der neue 3-Wege-Vergleich a <=> b mit dem "spaceship operator" erinnert an Arithmetic_IF, der Namensbereich std::rel_ops wird geächtet.
  • <coroutine> (TS N4680) verzahnt Prozeduren miteinander. Typen wie task<T> oder generator<T> fehlen noch in der Standard-Bibliothek, müssen aus cppcoro importiert werden.
  • <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>(), ispow2(), ceil2(), floor2(), log2p1()
  • <numbers>: Konstanten std::numbers::pi<double>, $e$, $\sqrt{2}$, goldener Schnitt $\phi = \frac{1+\sqrt{5}}{2}$ u.a.
  • <span>: Zugriff auf Speicherbereich ohne Eigentumsverhältnisse
  • <syncstream>: Synchronisation von I/O-Buffern
  • <version> ersetzt <ciso646> zur Versionserkennung, <source_location> statt __FILE__, __LINE__ etc.
  • Typen char8_t, u8string, u8string_view für UTF-8-kodierten Unicode-Text, Methoden s.starts_with(…) und sv.ends_with(…) für string und string_view
  • Initialisierungsteil in range-based for (int i=0; auto e:seq) std::cout << i++ << " : " << e << '\n';
  • bezeichnete Struktur-Initialisierer struct A { int x,y,z; }; A a{.x=1, .z=3}; aus der Schwestersprache C
  • std::erase(container, value) ist einfacher als c.erase(std::remove(c.begin(), c.end(), value), c.end())
  • std::erase_if(container, predicate) statt c.erase(std::remove_if(c.begin(), c.end(), pred), c.end())
  • Interpolieren und Extrapolieren mit std::midpoint(a, b) als (a + b)/2 für Werte bzw. a + (b-a)/2 für Zeiger a, b und std::lerp(a, b, t) als a + t*(b-a) in <numeric>

Technische Spezifikationen

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

  • Networking (TS N4711) standardisiert Netzwerk-Sockets und IP-Protokolle. Einige (von mir nicht geprüfte) Beispiele finden sich hier.
  • Parallelism v2 (TS N4742) : Algorithmen und Typen für Parallelverarbeitung.
  • Reflection (PDTS N4746) 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)
Herb Sutter: Oulu trip report (2016-06-30).
7)
"destructuring declaration" in Kotlin, "destructuring assignment" in Javascript, "tuple assignment"/"unpacking" in Python
8)
> std::chrono::nanoseconds{7.2e18}. Die Mühlen des ISO-C++-Komitees mahlen langsam. To Sheldon Cooper: No sarcasm sign here.
9)
Herb Sutter: Winter ISO C++ standards meeting (Kona) (2019-02-23).
10)
Bryce A. Lelbach: Cologne ISO WG21 Trip Report (2019-07-20).
11)
Bisher experimentierten GCC, Clang und Visual C++ damit.
modern_cpp.txt · Zuletzt geändert: 2019-08-26 08:46 von rrichter