namespace cpp

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


0x:ueberblick

Runderneuerung für 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 dem Standard C++98 brachte "Technical Report 1" (TR1) 2005 nur einige neue Bibliotheken.2) Die lange überfällige "Runderneuerung" C++113) wurde mit C++14 abgeschlossen4) und wird von wichtigen Compilern vollständig unterstützt. Die Sprache wird nun im 3-jährlichen Rhythmus weiterentwickelt (Zeitleiste). C++17 liegt als Draft International Standard (DIS) vor und bringt wichtige Neuerungen5). Parallel zum Standard werden Technische Spezifikationen (TS) entwickelt. Deren experimentelle Erweiterungen können nach Testphasen in kommende Standards (C++2?) einfließen. Die folgenden Aufzählungen sind unvollständig und in ihrer Rangfolge subjektiv.

C++11

Bibliotheken:

C++14

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);
  • Herleiten von Template-Argumenten aus Konstruktorparametern macht Funktionen wie make_pair() und make_tuple() überflüssig.
  • "Structured bindings"7) entpacken Werte aus einem zusammengesetzten Datentyp in neue Variablen, auch in Schleifen sowie Anweisungen if und switch, die um einen Initialisierungsteil erweitert wurden.
  • if constexpr (expression) lässt sich beim Übersetzen auswerten, der andere Zweig entfällt. Dies vereinfacht vor allem das "Spezialisieren" von Funktionsschablonen.
  • systemunabhängiger Zugriff auf das Dateisystem <filesystem>
  • Wrapper-Klassen std::optional<T> als Kapsel für ein nicht zwingend vorhandenes Objekt, std::any und std::variant<T1,...,Tn> als typsicherer Ersatz für void* und union
  • std::string_vew als einheitliche lesende Schnittstelle zur Inspektion von std::string und anderen Zeichenketten
  • std::byte als Enumerationstyp abgeleitet von unsigned char für Bitoperationen
  • Umhängen von einzelnen Knoten zwischen [unordered_][multi_]set|map und set1.merge(set2) zum Verschmelzen assoziativer Container
  • Die Berechnung von ggT und kgV hat es nach über 2300 Jahren8) aus Euklids Elementen in den C++-Standard geschafft: std::gcd(a,b)*std::lcm(a,b) == a*b.
  • parallelisierte Algorithmen und "spezielle" mathematische Funktionen (elliptische Integrale, Kugel- und Zylinderfunktionen, Hermite-, Laguerre- und Legendre-Polynome etc.), Pythagoras in 3D: std::hypot(x,y,z), Wertbegrenzung std::clamp(x,1,10) und zufällige Stichproben einer Sequenz std::sample(first, last, out, n, rng)
  • Geschachtelte Namensräume namespace A::B { … } sind ohne namespace A { namespace B { … } } angebbar.
  • Auswertereihenfolge für Funktionsargumente und Vermeiden unnötiger Kopien (copy elision) werden nun garantiert, C11 wird statt C99 Schwestersprache.

Technische Spezifikationen

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

  • Concepts (TS N4641) liefern aussagekräftige und vor allem kurze Fehlermeldungen bei der Template-Instanzierung und sind ab g++ 6 zu erproben.
  • Coroutines (PDTS N4649) vereinfachen miteinander verzahnte asynchron laufende Prozeduren.
  • Ranges (PDTS N4651) schlägt Algorithmen auf Datenbereichen sort(range) vor, setzt aber Concepts voraus. Nachfolgend9) (in einem Ranges TS v2?) können solche Algorithmen zu Flussketten (lazy "pipes") wie in Eric Nieblers Vortrag auf der CppCon2015 komponiert werden. Die C++11-Implementierung range-v3 gibt einen Vorgeschmack auf so eine künftige Standardbibliothek "Version 2".
  • Networking (PDTS N4656) standardisiert Netzwerk-Sockets und IP-Protokolle.
  • Modules (N4647, in Entwicklung) versprechen kürzere Übersetzungszeiten, wobei #include durch import-Anweisungen ersetzt werden. Visual Studio und Clang experimentieren damit.
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: N3797 (2013-10-13).
Herb Sutter: We have C++14! (2014-08-18).
5)
DIS N4660. Frei zugänglich: Working Draft N4659 (2017-03-21).
Herb Sutter: C++17 is complete. (2017-03-24)
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, aber gründlich. To Sheldon Cooper: No sarcasm sign here.
9)
P0459R0 Annex C: Future work. (2016-10-15)
0x/ueberblick.txt · Zuletzt geändert: 2017-05-16 18:08 von rrichter