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++268)/C++29) einfließen. Die folgenden Listen sind unvollständig und in ihrer Reihenfolge subjektiv.
—
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 Datenverarbeitungstd::philox_engine, std::ranges::generate_random() std::views::concat, std::views::cache_latest“Pandemic Edition” … not slowing down.
— Herb Sutter9)
import std; für Module der Standard-Bibliothekstd::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]iota(), shift_left(), shift_right(), starts_with(), ends_with(), contains(), fold()std::print("{}", std::vector{1,2,3,1}); → [1, 2, 3, 1], std::print("{}", std::set{1,2,3,1}); → {1, 2, 3}s.contains("C++") für string und string_viewstd::mdspan: mehrdimensionale Feldindizes a[i,j]std::optional<T> mit monadischen Operationen transform(), and_then(), or_else()int 💩 = 23;size_t: for (auto i = 0zu, s = v.size(); i < s; ++i) …std::flat_[multi]map<K,V>, std::flat_[multi]set<T>… our biggest nine-year-cycle yet … in terms of new features added.— Herb Sutter11)
std::ranges::sort(v); kombinierbare Views filter(odd) | transform(sqr) | take(3) verarbeiten Wertfolgen „lazy“13).<coroutine> verzahnt Prozeduren ineinander. Typen wie task<T> oder generator<T> fehlen leider noch14).std::format("C++{}", 20) erleichtert die Internationalisierung.<barrier>, <latch>, <semaphore>, <stoptoken> und RAII-konforme std::jthread (joining threads) ergänzen die Möglichkeiten zur nebenläufigen Verarbeitung. bit_cast<T>(x) statt dem undefiniertem Verhalten von &reinterpret_cast<T*>(&x) <ciso646> zur Versionserkennung, <source_location> löst __FILE__, __LINE__ etc. ab.for (int i=0; auto e:seq) ... (enumerate?)struct A { int x,y,z; }; A a{.x=1, .z=3}; aus C übernommenstd::erase(container, value) anstelle von c.erase(std::remove(c.begin(), c.end(), value), c.end()) undstd::erase_if(container, predicate) statt c.erase(std::remove_if(c.begin(), c.end(), predicate), c.end()) für Container,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);
for-Anweisungen sowie if und switch, die um einen Initialisierungsteil erweitert wurden.void* und unionnamespace A::B {…} für namespace A { namespace B {…} }if constexpr (expression) erleichtert das Schreiben von Funktionsschablonen ohne SFINAE-Tricks. [unordered_][multi_]set|map und set1.merge(set2) zum Verschmelzen assoziativer Containerauto answer{42}; ist nun endlich eine Ganzzahl.…completes C++11.
0b101010 und Stellentrennzeichen 1'234'567make_unique(), const-iterator-Funktionen cbegin(), cend()It feels like a new language.— Bjarne Stroustrup
>> am Ende verschachtelter Templates ohne Leerzeichen dazwischen, variadische Templatesaction::sort, unique, enumerate, zip oder to<std::vector> fehlen. Siehe auch: rangesnext.<experimental/generator>.
std::chrono::nanoseconds{7.2e18}. Die Mühlen des ISO-C++-Komitees mahlen langsam. To Sheldon Cooper: No sarcasm sign here.