modern_cpp
Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
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 (C++26) einfließen. Die folgenden Listen sind unvollständig und in ihrer Reihenfolge subjektiv.
C++26
—
- Static reflection?8)
- Unterstrich als Platzhalter für unbenutzte Variablen:
auto [x,_,z] = f();
<contracts>
: Vor- und Nachbedingungen, Zusicherungen<debugging>
: Breakpoints im Quellcode setzen, Debugger-Unterstützung<hive>
: Container für Elemente, die häufig entstehen und verschwinden (inspiriert von plf::colony)<linalg>
: lineare Algebra mit BLAS-Funktionen<simd>
: Datentypen für parallele Datenverarbeitung- Ganzzahlen ohne Überlauf ("saturation arithmetic")
- Zufallszahlengenerator
std::philox_engine
,std::ranges::generate_random()
std::views::concat
,std::views::cache_latest
C++23
“Pandemic Edition” … not slowing down.
— Herb Sutter9)
import std;
für Module der Standard-Bibliothek-
- an Python angelehnte Ausgabe mit
format()
(P2286):std::println("{}", std::set{1,2,3,1}); {1, 2, 3}
*
std::ranges::to<Container>(P1206) *
std::views::enumerate10),
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 * std::print() wirkt wie
std::cout << format(),
std::println(), formatierte Ausgabe für Ranges *
s.contains("C++")für
stringund
string_view*
std::mdspan: mehrdimensionale Feldindizes
a[i,j]* std::expected<Result,Error> und
std::optional<T>mit monadischen Operationen
transform(),
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 Sutter11) * Module12) überwinden Probleme des
#include-Mechanismus (Präprozessor, Makros).
import-Anweisungen beschleunigen das Übersetzen, übergangsweise auch
import <iostream>;Die Modularisierung der Standard-Bibliothek erfolgt erst mit C++23 (P0581). * <ranges> modernisiert <algorithm>, z.B.
std::ranges::sort(v);kombinierbare Views
filter(odd) | transform(sqr) | take(3)verarbeiten Wertfolgen „lazy“13). * Concepts beschränken Schablonen, ersparen SFINAE-Tricks, erleichtern den Compilern die Auswahl der passenden generischen Funktion und sorgen für hilfreichere Fehlermeldungen, falls
vnicht sortierbar ist. Generische Funktionen mit
auto-Parametern sind auch ohne den Vorsatz
template …Schablonen. *
<coroutine>verzahnt Prozeduren ineinander. Typen wie
task<T>oder
generator<T>fehlen leider noch14). * <format>: Typsichere, schnelle und flexible Aufbereitung von Ausgaben mit
std::format("C++{}", 20)erleichtert die Internationalisierung. * <chrono> erhält Zeitzonen und Kalender. * <compare>: Drei-Wege-Vergleich mit dem "spaceship operator"
a <=> b.
std::rel_opswird geächtet. *
<barrier>,
<latch>,
<semaphore>,
<stoptoken>und RAII-konforme
std::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. * Typen
char8_t,
u8string,
u8string_viewfür UTF-8-kodierten Unicode-Text, Methoden
s.starts_with(…)und
s.ends_with(…)für
stringund
string_view* 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 von
c.erase(std::remove(c.begin(), c.end(), value), c.end())und *
std::erase_if(container, predicate)statt
c.erase(std::remove_if(c.begin(), c.end(), predicate), c.end())für Container, *
std::midpoint(a, b)und Interpolieren mit
std::lerp(a, b, t)als
a + t*(b-a)in <numeric> *
std::shift_left(first,last,n)und
std::shift_right(first,last,n)in <algorithm> ===== 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 Sutter15) 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 bindings16) entpacken zusammengesetzte Werte, auch in
for-Anweisungen sowie
ifund
switch, 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*und
union* std::string_view als einheitliche lesende Schnittstelle zur Inspektion von std::string und anderen Zeichenketten, std::byte für Bitoperationen * ggT und kgV benötigten 2300 Jahre17) aus den Elementen nach C++: 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-, Legendre-Polynome… * geschachtelte Namensräume
namespace A::B {…}für
namespace A { namespace B {…} }*
if constexpr (expression)erleichtert das Schreiben von Funktionsschablonen ohne SFINAE-Tricks. * Umhängen von einzelnen Knoten zwischen
[unordered_][multi_]set|mapund
set1.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. » — ISO C++ FAQ * Binärliterale
0b101010und Stellentrennzeichen
1'234'567* Literalsuffixe
"Hallo"sfür <string>,
1.0 + 2.0ifür <complex>,
23h+56min+4sfür Zeitdauern in <chrono> * automatisches Erkennen des Ergebnistyps von Funktionen, generische Lambda-Ausdrücke und Lambda-capture-Ausdrücke *
make_unique(),
const-
iterator-Funktionen
cbegin(),
cend()* Funktionsobjekte std::greater<> ohne Typangabe möglich * std::quoted(s) für Ein- und Ausgabe von Zeichenketten mit Begrenzungszeichen ("Gänsefüßchen") * Variablen-Templates ===== C++11 ===== > It feels like a new language. » — Bjarne Stroustrup * neue Schlüsselwörter, auto-Variablen, range-based for, Lambda-Ausdrücke * 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 * raw strings,
nullptr'' statt Ganzzahl 0, Attributspezifizierer * Bibliotheken für * <thread>, <mutex>, <condition_variable>, <atomic>, <future>: Nebenläufigkeit * <memory>: intelligente Zeiger shared_ptr<T>, unique_ptr<T> * <array>, <forward_list>, <initializer_list>, <unordered_map>, <unordered_set>: neue Container * <regex>: reguläre Ausdrücke * <tuple>: Tupel * <random>: Zufallszahlgeneratoren * <ratio>: Verhältniszahlen * <chrono>: Uhren, Zeitpunkte, Zeitintervalle
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)
ISO International Standard ISO/IEC 14882:2024(en) – Programming Language C++. (2024-10).
Frei zugänglich: Final Working Draft N4950 (2023-05-10).
https://herbsutter.com/2022/11/12/trip-report-autumn-iso-c-standards-meeting-kona/ (2022-11-12),
S.M.Downey: We will all ignore the 2024, yes? https://www.reddit.com/r/cpp/comments/1g7jpbt/isoiec_148822024/ (2024-10-20).
Frei zugänglich: Final Working Draft N4950 (2023-05-10).
https://herbsutter.com/2022/11/12/trip-report-autumn-iso-c-standards-meeting-kona/ (2022-11-12),
S.M.Downey: We will all ignore the 2024, yes? https://www.reddit.com/r/cpp/comments/1g7jpbt/isoiec_148822024/ (2024-10-20).
8)
Herb Sutter: Trip Report: ISO C++ Standards Meeting Hagenberg. (2025-02-17)
9)
Herb Sutter: C++23 Pandemic Edition is complete. WG21 Winter Meeting Issaquah Trip Report. (2023-02-13)
10)
Inbal Levi: https://www.slideshare.net/InbalLevi5/isockona2022tripreportpptx (2023-01-17).
11)
Herb Sutter: Winter ISO C++ standards meeting (Kona) (2019-02-23).
12)
Compiler und Build-Infrastruktur erfordern Änderungen.
Clang,
Visual C++ und
GCC
experimentieren mit Modulen: Beispiel mit g++ 11,
C++20 Modules Status Report.
13)
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.14)
Siehe P2168R0.
Bibliotheken:
cppcoro (basiert auf Boost),
rangesnext,
Visual C++ bietet
<experimental/generator>
.
15)
Herb Sutter:
Oulu trip report (2016-06-30).
16)
„destructuring declaration“ in Kotlin,
„destructuring assignment“ in Javascript,
„tuple assignment“/„unpacking“ in Python
17)
>
std::chrono::nanoseconds{7.2e18}
. Die Mühlen des ISO-C++-Komitees mahlen langsam. To Sheldon Cooper: No sarcasm sign here.
modern_cpp.1746361957.txt.gz · Zuletzt geändert: 2025-05-04 14:32 von rrichter