namespace cpp {}

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


modern_cpp

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.


Vorhergehende Überarbeitung
modern_cpp [2024-02-19 12:26] (aktuell) – [C++23] rrichter
Zeile 1: Zeile 1:
 +====== 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
 +
 +
  

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki