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, Stand 15. März 2019, post Kona10)) nähert sich dem Ende:

  • Module (TS N4720) versprechen kürzere Übersetzungszeiten, #includes werden durch import-Anweisungen ersetzt. P0581 skizziert, wie die Standard-Bibliothek künftig modularisiert werden könnte. Dies geschieht noch nicht in C++20 :-(.
  • <coroutine> (TS N4680) verzahnt Prozeduren miteinander. Typen wie task<T> oder generator<T> fehlen noch :-(, müssen aus cppcoro importiert werden.
  • <ranges> für Standard-Algorithmen verarbeiten Datenbereiche bei Bedarf ("lazy"), in Pipelines gekoppelt. (Beispiel mit ranges-v3)11) Auch hier fehlen noch Teile :-(.
  • <concepts> beschränken Schablonen für aussagekräftige Fehlermeldungen.
  • <contracts>: Verträge int f(int x) [[pre: x>0]] [[post res: res>0]] für Funktionsschnittstellen und interne Zusicherungen [[assert: x<10]] führen bei Verletzung zu einer std::contract_violation.
  • <compare>: Der neue 3-Wege-Vergleich a <=> b mit dem "spaceship operator" erinnert an Arithmetic_IF, der Namensbereich 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.
  • 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

Bestehende Bibliotheken werden ergänzt:

  • 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: 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-05-19 18:13 von rrichter