| Vorhergehende Überarbeitung |
— | modern_cpp [2024-02-19 12:26] (aktuell) – [C++23] rrichter |
---|
| ====== 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((Bjarne Stroustrup: C++0x Initialization Lists. |
| Google Tech Talk (2007-02-21).)) |
| |
| Seit 2011 wird das „klassische“ [[..:kennen:begriffe#C++98]](( |
| ISO International Standard ISO/IEC 14882:1998(E) – Programming Language C++. (1989-09). „Bugfix“ C++03 (2003-10).\\ |
| Technical Report on C++ library extensions. [[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf |N1836]], (2005). |
| )) |
| im 3-Jahres-Rhythmus weiterentwickelt (siehe [[https://isocpp.org/std/status|Zeitleiste]]). |
| Aktuelle [[Compiler]] [[http://en.cppreference.com/w/cpp/compiler_support|unterstützen]] „modernes“ |
| [[#C++11]](( |
| Frei zugänglich: ISO C++ Working Draft (C++11 WD) = ISO Standard C++ 2011 + |
| Bugfixes [[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf|N3337]] (2012-01-16). |
| )), |
| [[#C++14]](( |
| N3796. Frei zugänglich: [[http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3797.pdf]] (2013-10-13).\\ |
| Herb Sutter: [[https://isocpp.org/blog/2014/08/we-have-cpp14|We have C++14!]] (2014-08-18). |
| )), |
| [[#C++17]](( |
| DIS N4660. Frei zugänglich: Working Draft [[http://open-std.org/JTC1/SC22/WG21/docs/papers/2017/n4659.pdf|N4659]] (2017-03-21).\\ |
| Herb Sutter: [[https://herbsutter.com/2017/09/06/c17-is-formally-approved/|C++17 is formally approved.]] (2017-09-06)\\ |
| Thomas Köppe: Changes between C++14 and C++17 DIS. [[https://isocpp.org/files/papers/p0636r0.html|P0636R0]] (2017-04-02)\\ |
| http://stackoverflow.com/questions/38060436/what-are-the-new-features-in-c17 (2016-06-30) |
| )), |
| [[#C++20]](( |
| ISO International Standard ISO/IEC 14882:2020(E) – Programming Language C++. (2020-12).\\ |
| DIS N4860. Frei zugänglich: Working Draft [[http://open-std.org/JTC1/SC22/WG21/docs/papers/2020/n4861.pdf|N4861]] (2020-04-01).\\ |
| Bryce A. Lelbach: |
| [[https://www.reddit.com/r/cpp/comments/f47x4o/202002_prague_iso_c_committee_trip_report_c20_is/|C++20 is done!]] (2020-02-15) \\ |
| Herb Sutter: [[https://herbsutter.com/2020/02/15/trip-report-winter-iso-c-standards-meeting-prague/| Trip report: Winter ISO C++ standards meeting (Prague)]] (2020-02-15).\\ |
| Herb Sutter: [[https://herbsutter.com/2020/09/06/c20-approved-c23-meetings-and-schedule-update/| C++20 approved.]] (2020-09-06). |
| )), |
| [[#C++23]](( |
| 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). |
| )) |
| zunehmend. |
| [[cppref>cpp/experimental|Technische Spezifikationen]] (TS) |
| und andere Vorschläge |
| können in den nächsten [[https://github.com/cplusplus/draft|Entwurf]] einfließen. |
| Die folgenden Listen sind unvollständig und in ihrer Reihenfolge subjektiv. |
| |
| ===== C++23 ===== |
| > //“Pandemic Edition” ... not slowing down.// |
| > --- Herb Sutter((Herb Sutter: [[https://herbsutter.com/2023/02/13/c23-pandemic-edition-is-complete-trip-report-winter-iso-c-standards-meeting-issaquah-wa-usa/|C++23 Pandemic Edition is complete.]] WG21 Winter Meeting Issaquah Trip Report. (2023-02-13) )) |
| |
| * ''import std;'' für Module der Standard-Bibliothek |
| * [[kennen:include:ranges]]: Temporäre Werte in range-based for leben länger ([[https://wg21.link/p2644|P2644]]). |
| * ''std::ranges::to<Container>'' ([[https://wg21.link/p1206r7|P1206]]) |
| * ''std::views::enumerate''((Inbal Levi: https://www.slideshare.net/InbalLevi5/isockona2022tripreportpptx (2023-01-17).)), ''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()'' |
| * an Python angelehnte Ausgabe mit ''format()'' ([[https://wg21.link/p2286|P2286]]) |
| * [[kennen:include:generator|std::generator<T>]] für Coroutinen |
| * [[kennen:include:print|std::print()]] wirkt wie ''%%std::cout << format()%%'', ''std::println()'', formatierte Ausgabe für Ranges |
| * ''s.contains("C++")'' für ''string'' und ''string_view'' |
| * ''std::mdspan'': mehrdimensionale Feldindizes ''a[i,j]'' |
| * [[kennen:include:expected|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>'' |
| * [[kennen:include:stacktrace|std::stacktrace]] hilft bei der Fehlersuche. |
| |
| ===== C++20 ===== |
| > // ... our biggest nine-year-cycle yet ... in terms of new features added. // |
| >> --- Herb Sutter((Herb Sutter: [[https://herbsutter.com/2019/02/23/trip-report-winter-iso-c-standards-meeting-kona/| Winter ISO C++ standards meeting (Kona)]] (2019-02-23). )) |
| |
| * [[kennen:Module]]((Compiler und Build-Infrastruktur erfordern Änderungen. |
| [[https://clang.llvm.org/docs/Modules.html|Clang]], |
| [[https://devblogs.microsoft.com/cppblog/standard-c20-modules-support-with-msvc-in-visual-studio-2019-version-16-8/|Visual C++]] und |
| [[https://gcc.gnu.org/wiki/cxx-modules|GCC]] |
| experimentieren mit Modulen: [[howto:modules_gcc11|Beispiel mit g++ 11]], |
| [[https://github.com/royjacobson/modules-report|C++20 Modules Status Report]]. |
| )) ü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 ([[https://wg21.link/P0581|P0581]]). |
| * [[kennen:include:ranges]] modernisiert [[kennen:include:algorithm]], z.B. ''std::ranges::sort(v);'' kombinierbare Views ''filter(odd) | transform(sqr) | take(3)'' verarbeiten Wertfolgen „lazy“((Von [[https://github.com/ericniebler/range-v3|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: [[https://github.com/cor3ntin/rangesnext|rangesnext]].)). |
| * [[kennen:concepts]] beschränken Schablonen, ersparen [[kennen:begriffe#SFINAE]]-Tricks, erleichtern den Compilern die Auswahl der passenden generischen Funktion und sorgen für hilfreichere Fehlermeldungen, falls ''v'' nicht 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 noch(( |
| Siehe [[https://wg21.link/p2168|P2168R0]]. |
| Bibliotheken: |
| [[https://github.com/lewissbaker/cppcoro|cppcoro]] (basiert auf Boost), |
| [[https://github.com/cor3ntin/rangesnext|rangesnext]], |
| Visual C++ bietet ''<experimental/generator>''. |
| )). |
| * [[kennen:include:format]]: Typsichere, schnelle und flexible Aufbereitung von Ausgaben mit ''std::format("C++{}", 20)'' erleichtert die Internationalisierung. |
| * [[kennen:include:chrono]] erhält [[https://mariusbancila.ro/blog/2018/03/27/cpp20-calendars-and-time-zones/|Zeitzonen und Kalender]]. |
| * [[kennen:include:compare]]: Drei-Wege-Vergleich mit dem "spaceship operator" ''%%a <=> b%%''. ''[[..:kennen:stl#vergleichsoperatoren|std::rel_ops]]'' wird [[kennen:begriffe#geächtet]]. |
| * ''<barrier>'', ''<latch>'', ''<semaphore>'', ''<stoptoken>'' und [[kennen:begriffe#RAII]]-konforme ''std::jthread'' (joining threads) ergänzen die Möglichkeiten zur nebenläufigen Verarbeitung. |
| * [[kennen:include:bit]]: Bits zählen, rotieren, ''bit_cast<T>(x)'' statt dem undefiniertem Verhalten von ''&reinterpret_cast<T*>(&x)'' |
| * [[kennen:include:numbers]] : mathematische Konstanten $\pi$, $e$, $\sqrt{2}$ u.a. |
| * [[kennen:include:span]] zeigt auf einen Bereich von aufeinanderfolgenden Elementen, ohne ihn zu besitzen (Zeiger und Anzahl der Elemente). |
| * [[kennen:include:syncstream]] garantiert in nebenläufigen Prozessen Ausgaben ohne Wettrennen. |
| * [[kennen:include:version]] ersetzt ''<ciso646>'' zur Versionserkennung, [[kennen:include:source_location]] löst ''%%__FILE__%%'', ''%%__LINE__%%'' etc. ab. |
| * Typen ''char8_t'', ''u8string'', ''u8string_view'' für [[wpde>UTF-8]]-kodierten [[http://reedbeta.com/blog/programmers-intro-to-unicode/|Unicode]]-Text, Methoden ''s.starts_with(...)'' und ''s.ends_with(...)'' für ''string'' und ''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 [[kennen:include:numeric]] |
| * ''std::shift_left(first,last,n)'' und ''std::shift_right(first,last,n)'' in [[kennen:include: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 Sutter((Herb Sutter: |
| [[https://herbsutter.com/2016/06/30/trip-report-summer-iso-c-standards-meeting-oulu/|Oulu trip report]] (2016-06-30). |
| )) |
| |
| 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 ([[kennen:begriffe#CTAD]]) macht Hilfsfunktionen wie [[..:kennen:lib:make_pair]] und [[..:kennen:lib:make_tuple]] überflüssig. |
| * [[kennen:begriffe#Structured bindings]]((„destructuring declaration“ in [[https://kotlinlang.org/docs/reference/multi-declarations.html|Kotlin]], |
| „destructuring assignment“ in [[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment|Javascript]], |
| „tuple assignment“/„unpacking“ in [[http://interactivepython.org/runestone/static/thinkcspy/Lists/TupleAssignment.html|Python]])) entpacken zusammengesetzte Werte, auch in ''for''-Anweisungen sowie ''if'' und ''switch'', die um einen Initialisierungsteil erweitert wurden. |
| * [[..:kennen:include:filesystem]]: Zugriff auf das Dateisystem |
| * [[..:kennen:include:optional|std::optional<T>]] als Kapsel für ein evtl. vorhandenes Objekt, [[..:kennen:include:any|std::any]] und [[..:kennen:include:variant|std::variant<T1,...,Tn>]] als typsicherer Ersatz für ''void*'' und ''union'' |
| * [[..:kennen:include:string_view|std::string_view]] als einheitliche lesende Schnittstelle zur Inspektion von [[..:kennen:include:string|std::string]] und anderen Zeichenketten, [[..:kennen:include:cstddef|std::byte]] für Bitoperationen |
| * [[wpde>Größter gemeinsamer Teiler|ggT]] und [[wpde>Kleinstes gemeinsames Vielfaches|kgV]] benötigten 2300 Jahre((> ''std::chrono::nanoseconds{7.2e18}''. Die Mühlen des ISO-C++-Komitees mahlen langsam. To [[wp>Sheldon Cooper]]: No sarcasm sign here. |
| )) aus den [[wpde>Elemente_(Euklid)|Elementen]] nach C++: [[..:kennen:lib:gcd|std::gcd(m,n)]]''*''[[..:kennen:lib:lcm|std::lcm(m,n)]]'' == m*n'' |
| * Pythagoras in 3D [[..:kennen:lib:hypot|std::hypot(x,y,z)]], Wertbegrenzung [[..:kennen:lib:clamp|std::clamp(x,1,10)]] und zufällige Stichproben einer Sequenz [[..:kennen:lib:sample|std::sample(first, last, out, n, rng)]] |
| * [[kennen:parallel_algorithms|parallelisierte Algorithmen]] und [[..:kennen:include:cmath#spezielle_funktionen|"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 [[..kennen:begriffe#SFINAE]]-Tricks. |
| * Umhängen von einzelnen Knoten zwischen ''[unordered_][multi_]set|map'' und ''set1.merge(set2)'' zum Verschmelzen assoziativer [[kennen:stl#Container]] |
| * Funktionsargumente werden stets v.l.n.r. ausgewertet, unnötige Kopien garantiert vermieden (copy elision), C11 statt C99 wird Schwestersprache. |
| * Die Regeln der [[kennen:initialisiererliste]] wurden geändert: ''auto answer{42};'' ist nun endlich eine Ganzzahl. |
| |
| ===== C++14 ===== |
| > // ...completes C++11. // |
| >> --- [[https://isocpp.org/wiki/faq/cpp14#cpp14-what|ISO C++ FAQ]] |
| |
| * Binärliterale ''0b101010'' und Stellentrennzeichen ''1'234'567'' |
| * Literalsuffixe ''"Hallo"s'' für [[:kennen:include:string]], ''1.0 + 2.0i'' für [[:kennen:include:complex]], ''23h+56min+4s'' für Zeitdauern in [[:kennen:include:chrono]] |
| * automatisches Erkennen des Ergebnistyps von Funktionen, [[kennen:lambda#generische Lambda-Ausdrücke]] und [[kennen:lambda#Lambda-capture-Ausdrücke]] |
| * ''make_unique()'', ''const''-''iterator''-Funktionen ''cbegin()'', ''cend()'' |
| * Funktionsobjekte [[..:kennen:stl#Funktionsadapter|std::greater<>]] ohne Typangabe möglich |
| * [[..:kennen:lib:quoted|std::quoted(s)]] für Ein- und Ausgabe von Zeichenketten mit Begrenzungszeichen ("Gänsefüßchen") |
| * [[..:kennen:beispiel:variable_template|Variablen-Templates]] |
| |
| ===== C++11 ===== |
| > // It feels like a new language. // |
| >> --- Bjarne Stroustrup |
| |
| * neue [[..:kennen:keywords]], [[kennen:beispiel:auto]]-Variablen, [[kennen:beispiel:range_based_for]], [[kennen:lambda|Lambda-Ausdrücke]] |
| * [[kennen:initialisiererliste]], Startwerte und Konstruktorparameter in geschweiften Klammern (einheitliche Schreibweise zur Anfangswertbelegung) |
| * [[kennen:Klassen#Attribute|Attribut-Initialisierung]]: Startwerte für Member-Variablen, zu- und abschaltbare [[kennen:spezielle_Methoden#default_und_delete|spezielle Methoden]], [[kennen:Klassen#Konstruktor-Delegation]] |
| * [[kennen:begriffe#Rvalue-Referenz|Rvalue-Referenzen]]: Unterscheidung von Kopier- und [[kennen:begriffe#Verschiebesemantik]] |
| * ''%%>>%%'' am Ende verschachtelter Templates ohne Leerzeichen dazwischen, variadische Templates |
| * [[kennen:sprachkern#zeichen_und_zeichenketten|raw strings]], ''nullptr'' statt Ganzzahl 0, [[kennen:attributspezifizierer]] |
| * Bibliotheken für |
| * [[..:kennen:include:thread]], [[..:kennen:include:mutex]], [[..:kennen:include:condition_variable]], [[..:kennen:include:atomic]], [[..:kennen:include:future]]: Nebenläufigkeit |
| * [[..:kennen:include:memory]]: intelligente Zeiger [[..:kennen:lib:shared_ptr|shared_ptr<T>]], [[..:kennen:lib:unique_ptr|unique_ptr<T>]] |
| * [[..:kennen:include:array]], [[..:kennen:include:forward_list]], [[..:kennen:include:initializer_list]], [[..:kennen:include:unordered_map]], [[..:kennen:include:unordered_set]]: neue [[..:kennen:stl#Container]] |
| * [[..:kennen:include:regex]]: reguläre Ausdrücke |
| * [[..:kennen:include:tuple]]: Tupel |
| * [[..:kennen:include:random]]: Zufallszahlgeneratoren |
| * [[..:kennen:include:ratio]]: Verhältniszahlen |
| * [[..:kennen:include:chrono]]: Uhren, Zeitpunkte, Zeitintervalle |
| |
| |
| |