ISO-komité for standardisering av C++-språket godkjent Internasjonal standard "C ++ 20". Mulighetene presentert i spesifikasjonen, med unntak av isolerte tilfeller, støttes i kompilatorer GCC, klang и Microsoft Visual C ++. Standardbiblioteker som støtter C++20 er implementert i prosjektet Øke.
I løpet av de neste to månedene vil den godkjente spesifikasjonen være på stadiet for å forberede dokumentet for publisering, hvor det vil bli arbeidet med redaksjonell retting av stavefeil og skrivefeil. I begynnelsen av november vil det resulterende dokumentet bli sendt til ISO for publisering under det formelle navnet ISO/IEC 14882:2020. I mellomtiden har komiteen allerede begynt arbeidet med neste C++23-standard (C++2b) og vil vurdere mulige alternativer på sitt neste virtuelle møte. innovasjoner.
Lagt til "konsepter", malutvidelser, som lar deg definere et sett med malparameterkrav som på kompileringstidspunktet begrenser settet med argumenter som kan aksepteres som malparametere. Konseptene kan brukes for å unngå logiske inkonsekvenser mellom egenskapene til datatypene som brukes i malen og datatypeegenskapene til inngangsparameterne.
mal
konsept LikhetSammenlignbar = krever(T a, T b) {
{ a == b } -> std::boolean;
{ a != b } -> std::boolean;
};
Akseptert utvidelse for arbeid med moduler som kan brukes i stedet for overskriftsfiler. Moduler gir en ny måte å organisere kildekoden på basert på å definere grensene for komponenter, uten å inkludere overskriftsfiler via "#inkludere".
Makro __VA_OPT__ for adaptiv utvidelse av variable makroer avhengig av tilstedeværelsen av tokens i variabelargumentet.
Støtte for ""-operatøren for treveis sammenligning.
Støtte for standardelementinitialiserere for bitfelt.
Evne til å lambdafange "*dette" uttrykk.
struct int_value {
int n = 0;
auto getter_fn() {
//DÅRLIG:
// return [=]() { return n; };
// FLINK:
return [=, *this]() { return n; };
}
};
Kalle opp elementer med peker (peker-til-medlem), ved hjelp av pekere til midlertidige objekter definert gjennom "const &"-uttrykket.
Slette-operatøren med en destruktor beskrevet i dokumentet P0722R1.
Klasser har lov til å bruke malparametere uten en type.
get_foo(); // bruker implisitt konstruktør
get_foo ();
Ikke-vedvarende lambda-uttrykk med konstruktør.
Tillater malsyntaks for lambda-uttrykk ("auto f = [] (std::vektor v)").
Evne til å bruke strengliteraler i malparametere.
Støtte for initialiseringssyntaks i C-stil - felt som ikke er eksplisitt oppført i initialiseringslisten, initialiseres som standard.
struktur A {
intx;
int y;
int z = 123;
};
A a {.x = 1, .z = 2}; // ax == 1, ay == 0, az == 2
Støtte for tomme datastrukturmedlemmer.
Støtte for sannsynlige og usannsynlige attributter for å informere optimalisereren om sannsynligheten for at den betingede konstruksjonen utløses ("[[sannsynlig]] hvis (tilfeldig > 0) {").
Evne til å bruke områder for å initialisere variabelverdier i en "for"-løkke
for (auto v = std::vektor{1, 2, 3}; auto& e : v) {
Automatisk beregning av matrisestørrelse i ny ("ny dobbel[]{1,2,3}");
«[[no_unique_address]]»-attributtet der variabler uten data ikke tar opp plass.
Atompekere (std::atomic > og std::atomic >).
Evne til å kalle virtuelle funksjoner i betingede uttrykk.
Støtte for umiddelbare funksjoner som kun kan fungere med konstanter.
consteval int sqr(int n) {
returner n * n;
}
constexpr int r = sqr(100); // OK
int x = 100;
int r2 = sqr(x); // FEIL: 'x' kan ikke brukes som konstant
Mulighet for å bruke constexpr med virtuelle funksjoner ("constexpr virtual int f() const { return 2; }").
I standardbiblioteket:
Lagt til støtte for char8_t-typen for UTF-8-strenger.
Lagt til overskriftsfiler bit (bitoperasjoner) og versjon.
Det er nå mulig å sjekke prefikset og suffikset til strenger (starter_med, slutter_med).
Lagt til std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible og std::type_identity-trekk.
Lagt til funksjoner std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated og std::assume_aligned.
Lagt til støtte for arrays til std::make_shared.
Lagt til std::to_array-funksjon for å konvertere array-lignende objekter til std::array.
std::string_view to_string(rgba_color_channel my_channel) {
bytte (min_kanal) {
bruker enum rgba_color_channel;
case rød: returner "rød";
grønn sak: returner "grønn";
case blue: returner "blå";
case alpha: returner "alpha";
}
}
I indekser, på grunn av udefinert oppførsel, er bruk av operasjonen "," ("a[b,c]") forbudt. Støtte for de fleste operasjoner med variabler deklarert med det flyktige nøkkelordet har blitt avviklet, inkludert "++" og "—" operasjonene med standardtyper.
Redusert antall situasjoner der "typenavn" kreves for å indikere tilstedeværelsen av en type.