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 künftige Standards (C++20 oder später) einfließen. Die folgende unvollständige Aufzählung ist in ihrer Reihenfolge subjektiv.

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 für C++20 (C++2a) ist nun fast fertig10) (Stand Februar 2019) und enthält u.a.:

  • Modules (TS N4720) versprechen kürzere Übersetzungszeiten, wobei #include durch import-Anweisungen ersetzt werden. P0581 skizziert, wie die Standard-Bibliothek künftig modularisiert werden könnte.
  • Coroutines (TS N4680) vereinfachen miteinander verzahnte asynchron laufende Prozeduren.
  • <ranges>: für Standard-Algorithmen verarbeiten Datenbereiche bei Bedarf ("lazy"), in Pipelines gekoppelt. (Beispiel mit ranges-v3)11)
  • <concepts>: Concepts beschränken Schablonen für aussagekräftige Fehlermeldungen.
  • <contract>: Verträge für Funktionsschnittstellen: int f(int x) [[pre: x>0]] [[post res: res>0]]; und Zusicherungen [[assert: x<10]]
  • <compare>: 3-Wege-Vergleich a <=> b mit dem "spaceship operator" erinnert an Arithmetic_IF; std::rel_ops wird geächtet.
  • <bit>: bitweise Berechnungen: bit_cast<T>(), ispow2(), ceil2(), floor2(), log2p1()
  • <span>: Zugriff auf Speicherbereich ohne Eigentumsverhältnisse
  • <syncstream>: Synchronisation von I/O-Buffern
  • <version> ersetzt <ciso646> zur Versionserkennung.
  • 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

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 (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: Kona ISO WG21 Trip Report (2019-02-24).
11)
The One Ranges Proposal (Merging the Ranges TS) wurde angenommen. Dieses setzt nur einen kleinen, aber wichtigen ersten Teil von ranges-v3 um.
https://www.reddit.com/r/cpp/comments/9vwvbz/2018_san_diego_iso_c_committee_trip_report_ranges/
modern_cpp.txt · Zuletzt geändert: 2019-04-07 19:19 von rrichter