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 Stroustrup1)
Seit 2011 wird das „klassische“ C++982) im 3-Jahres-Rhythmus weiterentwickelt (siehe Zeitleiste). Aktuelle Compiler unterstützen „modernes“ C++113), C++144), C++175), C++206), C++237) zunehmend. Technische Spezifikationen (TS) und andere Vorschläge können in den nächsten Entwurf einfließen. Die folgenden Listen sind unvollständig und in ihrer Reihenfolge subjektiv.
C++26
—
- Unterstrich als Platzhalter für unbenutzte Variablen:
auto [x,_,z] = f();
C++23
“Pandemic Edition” … not slowing down.
— Herb Sutter8)
import std;
für Module der Standard-Bibliothek-
- an Python angelehnte Ausgabe mit
format()
(P2286) std::ranges::to<Container>
(P1206)std::views::enumerate
9),as_const
,as_rvalue
,cartesian_product
,chunk[_by]
,join_with
,repeat
,slide
,stride
,adjacent[_transform]
,pairwise[_transform]
,zip[_transform]
- Algorithmen:
iota()
,shift_left()
,shift_right()
,starts_with()
,ends_with()
,contains()
,fold()
- std::generator<T> für Coroutinen
s.contains("C++")
fürstring
undstring_view
std::mdspan
: mehrdimensionale Feldindizesa[i,j]
- std::expected<Result,Error> und
std::optional<T>
mit monadischen Operationentransform()
,and_then()
,or_else()
- Quelltext in UTF-8 zulässig, Unicode Annex 31 für Bezeichner:
int 💩 = 23;
- Literalsuffix (vorzeichenloser)
size_t
:for (auto i = 0zu, s = v.size(); i < s; ++i) …
- cachefreundliche Container
std::flat_[multi]map<K,V>
,std::flat_[multi]set<T>
- std::stacktrace hilft bei der Fehlersuche.
C++20
… our biggest nine-year-cycle yet … in terms of new features added.— Herb Sutter10)
- <ranges> modernisiert <algorithm>, z.B.
std::ranges::sort(v);
kombinierbare Viewsfilter(odd) | transform(sqr) | take(3)
verarbeiten Wertfolgen „lazy“12). <coroutine>
verzahnt Prozeduren ineinander. Typen wietask<T>
odergenerator<T>
fehlen leider noch13).- <format>: Typsichere, schnelle und flexible Aufbereitung von Ausgaben mit
std::format("C++{}", 20)
erleichtert die Internationalisierung. - <chrono> erhält Zeitzonen und Kalender.
<barrier>
,<latch>
,<semaphore>
,<stoptoken>
und RAII-konformestd::jthread
(joining threads) ergänzen die Möglichkeiten zur nebenläufigen Verarbeitung.- <bit>: Bits zählen, rotieren,
bit_cast<T>(x)
statt dem undefiniertem Verhalten von&reinterpret_cast<T*>(&x)
- <numbers> : mathematische Konstanten $\pi$, $e$, $\sqrt{2}$ u.a.
- <span> zeigt auf einen Bereich von aufeinanderfolgenden Elementen, ohne ihn zu besitzen (Zeiger und Anzahl der Elemente).
- <syncstream> garantiert in nebenläufigen Prozessen Ausgaben ohne Wettrennen.
- <version> ersetzt
<ciso646>
zur Versionserkennung, <source_location> löst__FILE__
,__LINE__
etc. ab. - Initialisierungsteil in
for (int i=0; auto e:seq) ...
(enumerate?) - bezeichnete Struktur-Initialisierer
struct A { int x,y,z; }; A a{.x=1, .z=3};
aus C übernommen - Funktionen
std::erase(container, value)
anstelle vonc.erase(std::remove(c.begin(), c.end(), value), c.end())
undstd::erase_if(container, predicate)
stattc.erase(std::remove_if(c.begin(), c.end(), predicate), c.end())
für Container,
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 Sutter14)
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({key, value}); success) use(it);
- Erschließen von Template-Argumenten aus Konstruktorparametern (CTAD) macht Hilfsfunktionen wie make_pair() und make_tuple() überflüssig.
- Structured bindings15) entpacken zusammengesetzte Werte, auch in
for
-Anweisungen sowieif
undswitch
, die um einen Initialisierungsteil erweitert wurden. - <filesystem>: Zugriff auf das Dateisystem
- std::optional<T> als Kapsel für ein evtl. vorhandenes Objekt, std::any und std::variant<T1,...,Tn> als typsicherer Ersatz für
void*
undunion
- std::string_view als einheitliche lesende Schnittstelle zur Inspektion von std::string und anderen Zeichenketten, std::byte für Bitoperationen
- 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-, Legendre-Polynome…
- geschachtelte Namensräume
namespace A::B {…}
fürnamespace A { namespace B {…} }
if constexpr (expression)
erleichtert das Schreiben von Funktionsschablonen ohne SFINAE-Tricks.- Umhängen von einzelnen Knoten zwischen
[unordered_][multi_]set|map
undset1.merge(set2)
zum Verschmelzen assoziativer Container - Funktionsargumente werden stets v.l.n.r. ausgewertet, unnötige Kopien garantiert vermieden (copy elision), C11 statt C99 wird Schwestersprache.
- Die Regeln der Initialisiererliste wurden geändert:
auto answer{42};
ist nun endlich eine Ganzzahl.
C++14
…completes C++11.
- Binärliterale
0b101010
und Stellentrennzeichen1'234'567
- automatisches Erkennen des Ergebnistyps von Funktionen, generische Lambda-Ausdrücke und Lambda-capture-Ausdrücke
make_unique()
,const
-iterator
-Funktionencbegin()
,cend()
- Funktionsobjekte std::greater<> ohne Typangabe möglich
- std::quoted(s) für Ein- und Ausgabe von Zeichenketten mit Begrenzungszeichen ("Gänsefüßchen")
C++11
It feels like a new language.— Bjarne Stroustrup
- Initialisiererliste, Startwerte und Konstruktorparameter in geschweiften Klammern (einheitliche Schreibweise zur Anfangswertbelegung)
- Attribut-Initialisierung: Startwerte für Member-Variablen, zu- und abschaltbare spezielle Methoden, Konstruktor-Delegation
- Rvalue-Referenzen: Unterscheidung von Kopier- und Verschiebesemantik
>>
am Ende verschachtelter Templates ohne Leerzeichen dazwischen, variadische Templates- Bibliotheken für
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).
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).
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 formally approved. (2017-09-06)
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)
Herb Sutter: C++17 is formally approved. (2017-09-06)
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)
ISO International Standard ISO/IEC 14882:2020(E) – Programming Language C++. (2020-12).
DIS N4860. Frei zugänglich: Working Draft N4861 (2020-04-01).
Bryce A. Lelbach: C++20 is done! (2020-02-15)
Herb Sutter: Trip report: Winter ISO C++ standards meeting (Prague) (2020-02-15).
Herb Sutter: C++20 approved. (2020-09-06).
DIS N4860. Frei zugänglich: Working Draft N4861 (2020-04-01).
Bryce A. Lelbach: C++20 is done! (2020-02-15)
Herb Sutter: Trip report: Winter ISO C++ standards meeting (Prague) (2020-02-15).
Herb Sutter: C++20 approved. (2020-09-06).
7)
https://github.com/steve-downey/papers/blob/master/wg21-status.org (2022-06-15),
https://wg21.link/n4917 Working Draft (PDF) (2022-09-05),
https://herbsutter.com/2022/11/12/trip-report-autumn-iso-c-standards-meeting-kona/ (2022-11-12).
https://wg21.link/n4917 Working Draft (PDF) (2022-09-05),
https://herbsutter.com/2022/11/12/trip-report-autumn-iso-c-standards-meeting-kona/ (2022-11-12).
8)
Herb Sutter: C++23 Pandemic Edition is complete. WG21 Winter Meeting Issaquah Trip Report. (2023-02-13)
9)
Inbal Levi: https://www.slideshare.net/InbalLevi5/isockona2022tripreportpptx (2023-01-17).
10)
Herb Sutter: Winter ISO C++ standards meeting (Kona) (2019-02-23).
11)
Compiler und Build-Infrastruktur erfordern Änderungen.
Clang,
Visual C++ und
GCC
experimentieren mit Modulen: Beispiel mit g++ 11,
C++20 Modules Status Report.
12)
Von range-v3 wurde (bisher) nur eine kleine Auswahl übernommen. Wichtige, nützliche Bausteine wie
action::sort
, unique
, enumerate
, zip
oder to<std::vector>
fehlen. Siehe auch: rangesnext.13)
Siehe P2168R0.
Bibliotheken:
cppcoro (basiert auf Boost),
rangesnext,
Visual C++ bietet
<experimental/generator>
.
14)
Herb Sutter:
Oulu trip report (2016-06-30).
15)
„destructuring declaration“ in Kotlin,
„destructuring assignment“ in Javascript,
„tuple assignment“/„unpacking“ in Python
16)
>
std::chrono::nanoseconds{7.2e18}
. Die Mühlen des ISO-C++-Komitees mahlen langsam. To Sheldon Cooper: No sarcasm sign here.
modern_cpp.txt · Zuletzt geändert: 2024-05-11 12:44 von rrichter