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)

Eine gefühlte Ewigkeit nach C++98 und C++03 schlug "Technical Report 1" (TR1) einige Neuerungen vor.2) Mit C++113), C++144), C++175) folgende Neuerungen im 3-jährlichen Rhythmus werden von Compilern zunehmend unterstützt.(Zeitleiste). Technische Spezifikationen können in kommende Standards (C++2a oder später) einfließen. Die Aufzählung ist unvollständig und in ihrer Rangfolge subjektiv.

C++11

It feels like a new language.
— Bjarne Stroustrup

C++14

a minor bugfix …

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 Juni 2018):

  • Concepts (TS N4641) beschränken Schablonen und erlauben kurze aussagekräftige Fehlermeldungen. Sie sind ab g++ 6 zu erproben (Option -fconcepts). Grundlegende Konzepte der Standardbibliothek im neuen Header <concepts> kommen aus Ranges TS. Die "Kurzschrift" void sort(Sortable s) wird allerdings noch debattiert.
  • bezeichnete Struktur-Initialisierer struct A { int x,y,z; }; A a{.x=1, .z=3}; aus der Schwestersprache C
  • 3-Wege-Vergleich "spaceship operator" a <=> b erinnert an Arithmetic_IF in FORTRAN (60 Jahre später); zugleich wird std::rel_ops geächtet, Header <compare>
  • 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
  • <version> ersetzt <ciso646> zur Versionserkennung
  • <span>: Speicherbereich ohne Eigentumsverhältnisse
  • <syncstream>: Synchronisation von I/O-Buffern
  • <bit>: bitweise Berechnungen: bit_cast<T>(), ispow2(), ceil2(), floor2(), log2p1()
  • <contract>: Verträge für Funktionsschnittstellen: int f(int x) [[expects: x>0]] [[ensures res: res>0]]; und Zusicherungen [[assert: x<10]]

Technische Spezifikationen

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

  • Coroutines (TS N4680) vereinfachen miteinander verzahnte asynchron laufende Prozeduren.
  • Ranges (TS N4685) leistet Vorarbeit für Datenflussketten wie in Eric Nieblers Vortrag auf der CppCon 2015. Seine range-v3-Bibliothek gibt einen Vorgeschmack auf eine künftige Standardbibliothek "Version 2". Nach Übernahme in den Standard (P0896R2 Merging the Range TS) sind noch Views und Pipes (P0789R2 Range Adaptors and Utilities) zu ergänzen.
  • Networking (TS N4711) standardisiert Netzwerk-Sockets und IP-Protokolle.
  • Modules (TS N4720) versprechen kürzere Übersetzungszeiten, wobei #include durch import-Anweisungen ersetzt werden.
  • Parallelism v2 (TS N4742) für parallele Algorithmen.
  • Reflection (PDTS N4746) ermöglicht mit reflexpr Zugriff auf Namen und Eigenschaften von Typen und Variablen.
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.
0x/ueberblick.txt · Zuletzt geändert: 2018-09-17 16:19 von rrichter