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 einfließen. Die folgenden Listen sind unvollständig und in ihrer Reihenfolge subjektiv.
—
auto [x,_,z] = f();
“Pandemic Edition” … not slowing down.
— Herb Sutter8)
import std;
für Module der Standard-Bibliothekformat()
(P2286)std::ranges::to<Container>
(P1206)std::views::enumerate
9), 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()
s.contains("C++")
für string
und string_view
std::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 Sutter10)
std::ranges::sort(v);
kombinierbare Views filter(odd) | transform(sqr) | take(3)
verarbeiten Wertfolgen „lazy“12).<coroutine>
verzahnt Prozeduren ineinander. Typen wie task<T>
oder generator<T>
fehlen leider noch13).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 Sutter14)
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 union
namespace 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'567
make_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.