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 der Standardisierung (C++98, C++03) brachte "Technical Report 1" (TR1) 2005 nur einige neue Bibliotheken.2) Mit C++113) und C++144) wurde die Sprache "runderneuert" und wird seither im 3-jährlichen Rhythmus in kleineren Schritten weiterentwickelt (Zeitleiste). C++17 mit bedeutenden Neuerungen5) für "Normalanwender" und "Spezialisten" wird von aktuellen Compilern zunehmend unterstützt. Parallel entwickelte Technische Spezifikationen (TS) können nach Testphasen in kommende Standards (C++2a?) einfließen. Die folgenden Aufzählungen sind unvollständig und in ihrer Rangfolge subjektiv.

C++11

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);
  • Das Erschließen von Template-Argumenten aus Konstruktorparametern macht Hilfsfunktionen wie make_pair() und make_tuple() überflüssig.
  • "Structured bindings"7) entpacken zusammengesetzte Werte in getrennte Variablen, auch in for-Anweisungen sowie if und switch, die um einen Initialisierungsteil erweitert wurden.
  • 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_view als einheitliche lesende Schnittstelle zur Inspektion von std::string und anderen Zeichenketten
  • std::byte als Enumerationstyp abgeleitet von unsigned char für Bitoperationen
  • Die Berechnung von ggT und kgV hat es nach über 2300 Jahren8) aus Euklids Elementen in den C++-Standard geschafft: std::gcd(m,n)*std::lcm(m,n) == m*n.
  • 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)
  • parallelisierte Algorithmen und "spezielle" mathematische Funktionen (elliptische Integrale, Kugel- und Zylinderfunktionen, Hermite-, Laguerre- und Legendre-Polynome etc.),
  • Geschachtelte Namensräume namespace A::B {…} sind ohne namespace A { namespace B {…} } angebbar.
  • if constexpr (expression), beim Übersetzen ausgewertet, vereinfacht das Schreiben von Funktionsschablonen.
  • Umhängen von einzelnen Knoten zwischen [unordered_][multi_]set|map und set1.merge(set2) zum Verschmelzen assoziativer Container
  • Auswertereihenfolge für Funktionsargumente und Vermeiden unnötiger Kopien (copy elision) werden nun garantiert, C11 wird statt C99 Schwestersprache.

C++2a

Im nächsten Standard-Entwurf sind bereits integriert (Stand Dez. 2017):

  • Concepts (TS N4641) ermöglichen kurze aussagekräftige Fehlermeldungen bei der Template-Instanzierung und sind ab g++ 6 zu erproben.
  • bezeichnete Struktur-Initialisierer struct A { int x,y,z; }; A a{.x=1, .z=3}; aus der Schwestersprache C
  • spaceship operator a <=> b: 3-Wege-Vergleich, verwandt mit dem Arithmetic_IF in FORTRAN (60 Jahre später); zugleich wird std::rel_ops geächtet
  • Initialisierungsteil in "range-based" for (int i=0; auto e:seq) std::cout << i++ << " : " << e << '\n';
  • Methoden s.starts_with(…) und sv.ends_with(…) für Zeichenketten-Typen string und string_view

Technische Spezifikationen

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

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, aber gründlich. To Sheldon Cooper: No sarcasm sign here.
9)
P0789R2 Range Adaptors and Utilities (2018-02-11).
0x/ueberblick.txt · Zuletzt geändert: 2018-03-18 12:06 von rrichter