Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung |
modern_cpp [2023-02-23 10:23] – [Modernes C++] rrichter | modern_cpp [2024-02-19 12:26] (aktuell) – [C++23] rrichter |
---|
Google Tech Talk (2007-02-21).)) | Google Tech Talk (2007-02-21).)) |
| |
Seit 2011 wird das "klassische" [[..:kennen:begriffe#C++98]](( | 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).\\ | 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). | 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]]). | 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" | Aktuelle [[Compiler]] [[http://en.cppreference.com/w/cpp/compiler_support|unterstützen]] „modernes“ |
[[#C++11]](( | [[#C++11]](( |
Frei zugänglich: ISO C++ Working Draft (C++11 WD) = ISO Standard C++ 2011 + | Frei zugänglich: ISO C++ Working Draft (C++11 WD) = ISO Standard C++ 2011 + |
| |
* ''import std;'' für Module der Standard-Bibliothek | * ''import std;'' für Module der Standard-Bibliothek |
* Ranges: Temporäre Werte in range-based for leben länger ([[https://wg21.link/p2644|P2644]]). | * [[kennen:include:ranges]]: Temporäre Werte in range-based for leben länger ([[https://wg21.link/p2644|P2644]]). |
* ''std::ranges::to<Container>'', ''std::views::enumerate''((Inbal Levi: https://www.slideshare.net/InbalLevi5/isockona2022tripreportpptx (2023-01-17).)) und weitere Adapter: ''as_const'', ''as_rvalue'', ''cartesian_product'', ''chunk[_by]'', ''join_with'', ''repeat'', ''slide'', ''stride'', ''adjacent[_transform]'', ''pairwise[_transform]'', ''zip[_transform]'' | * ''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()'' | * Algorithmen: ''iota()'', ''shift_left()'', ''shift_right()'', ''starts_with()'', ''ends_with()'', ''contains()'', ''fold()'' |
* ''std::generator<T>'' für Coroutinen | * an Python angelehnte Ausgabe mit ''format()'' ([[https://wg21.link/p2286|P2286]]) |
* ''std::print()'' wirkt wie ''%%std::cout << format()%%'', ''std::println()'', formatierte Ausgabe für Ranges | * [[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'' | * ''s.contains("C++")'' für ''string'' und ''string_view'' |
* ''std::mdspan'': mehrdimensionale Feldindizes ''a[i,j]'' | * ''std::mdspan'': mehrdimensionale Feldindizes ''a[i,j]'' |
* ''std::expected<Result,Error>'' und ''std::optional<T>'' mit monadischen Operationen ''transform()'', ''and_then()'', ''or_else()'' | * [[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;'' | * 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) ...'' | * 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>'' | * cachefreundliche Container ''std::flat_[multi]map<K,V>'', ''std::flat_[multi]set<T>'' |
* ''std::stacktrace'' hilft bei der Fehlersuche. | * [[kennen:include:stacktrace|std::stacktrace]] hilft bei der Fehlersuche. |
| |
===== C++20 ===== | ===== C++20 ===== |
[[https://devblogs.microsoft.com/cppblog/standard-c20-modules-support-with-msvc-in-visual-studio-2019-version-16-8/|Visual C++]] und | [[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]] | [[https://gcc.gnu.org/wiki/cxx-modules|GCC]] |
experimentieren mit Modulen: [[howto:modules_gcc11|Beispiel mit g++ 11]]. | 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]]). | )) ü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: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. | * [[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(( | * ''<coroutine>'' verzahnt Prozeduren ineinander. Typen wie ''task<T>'' oder ''generator<T>'' fehlen leider noch(( |
| |
* Erschließen von Template-Argumenten aus Konstruktorparametern ([[kennen:begriffe#CTAD]]) macht Hilfsfunktionen wie [[..:kennen:lib:make_pair]] und [[..:kennen:lib:make_tuple]] überflüssig. | * 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]], | * [[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]], | „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. | „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: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: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'' |