ISO-komiteen for standardisering av programmeringsspråket C++ internasjonale standard "". Mulighetene som er presentert i spesifikasjonen, med unntak av enkelte tilfeller, i kompilatorer , og . Støttende C++20 standardbiblioteker er implementert innenfor prosjektet .
I løpet av de neste to månedene vil den godkjente spesifikasjonen være i dokumentforberedelsesstadiet for publisering, der det vil bli utført arbeid med redaksjonell gjennomgang av stavefeil og trykkfeil. I begynnelsen av november vil den endelige versjonen av dokumentet bli sendt til ISO for publisering under det formelle navnet ISO/IEC 14882:2020. I mellomtiden har komiteen allerede begynt arbeidet med neste standard C++23 (C++2b) og vil i det kommende virtuelle møtet vurdere mulige .
():
- «konsepter» er lagt til, utvidelser av maler som gjør det mulig å definere et sett av krav til malparametere, som under kompilering begrenser settet av argumenter som kan tas som malparametere. Konsepter kan brukes for å unngå logiske uoverensstemmelser mellom egenskapene til datatyper som brukes i malen, og egenskapene til datatyper for inngangsparametrene.
template
concept EqualityComparable = requires(T a, T b) {
{ a == b } -> std::boolean;
{ a != b } -> std::boolean;
}; - Det er tatt inn for arbeid med moduler, som kan brukes i stedet for header-filer. Moduler gir en ny måte å organisere kildekodene på basert på å definere grensene til komponentene, uten å bruke header-filer inkludert med «#include».
- Makro __VA_OPT__ for adaptiv utfoldelse av varianter av makroer avhengig av tilstedeværelsen av token i varianter av argumentet.
- Støtte for «» operatoren for tredjeparts sammenligning.
- Støtte for standard element-initierere for bitfelter.
- Mulighet for lambda-fangst av uttrykk «*this».
struct int_value {
int n = 0;
auto getter_fn() {
// BAD:
// return [=]() { return n; };// GOOD:
return [=, *this]() { return n; };
}
}; - Kall av elementer ved pekere (Pointer-to-member), ved å bruke pekere definert gjennom uttrykket «const &» på midlertidige objekter.
- Delete operator med destruktør beskrevet i dokumentet .
- Klasser tillates å bruke malparametre uten type.
struct foo {
foo() = default;
constexpr foo(int) {}
};template
auto get_foo() {
return f;
}get_foo(); // bruker implicit konstruktør
get_foo(); - Ikke-lagrende lambda-uttrykk med konstruktør.
- Mulighet for å bruke template-syntaks for lambda-uttrykk («auto f = [](std::vector v)»).
- Mulighet for å bruke strenglitteraler i template-parametere.
- Støtte for C-stil initialisering — eksplisitt ikke-opplistede felt initialiseres til standardverdier.
struct A {
int x;
int y;
int z = 123;
};A a {.x = 1, .z = 2}; // a.x == 1, a.y == 0, a.z == 2
- Støtte for tomme datamedlemmer.
- Støtte for attributtene likely og unlikely for å informere optimereren om sannsynligheten for at en betingelse blir oppfylt («[[likely]] if (random > 0) {«).
- Mulighet for å bruke intervaller for å initialisere variabelverdier i en «for»-løkke.
for (auto v = std::vector{1, 2, 3}; auto& e : v) {
- Automatisk beregning av array-størrelse i new («new double[]{1,2,3}»);
- Attributtet «[[no_unique_address]]» hvor variabler uten data ikke tar plass.
- Atomiske pekere (std::atomic<shared_ptr> og std::atomic<weak_ptr>).
- Mulighet for å kalle virtuelle funksjoner i betingede uttrykk.
- Støtte for umiddelbare funksjoner som kun kan jobbe med konstanter.
consteval int sqr(int n) {
return 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:
- Støtte for typen char8_t for UTF-8-strenger er lagt til.
- Hodet filer for bit (bitoperasjoner) og versjon er lagt til.
- Mulighet for å sjekke prefikser og suffikser av strenger (starts_with, ends_with).
- Typer som std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible og std::type_identity er lagt til.
- Funksjoner som std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated og std::assume_aligned er lagt til.
- Støtte for arrays er lagt til i std::make_shared.
- Funksjonen std::to_array for å konvertere array-lignende objekter til std::array er lagt til.
- Mer praktisk syntaks for oppramsing:
enum class rgba_color_channel { red, green, blue, alpha };
std::string_view to_string(rgba_color_channel my_channel) {
switch (my_channel) {
using enum rgba_color_channel;
case red: return «red»;
case green: return «green»;
case blue: return «blue»;
case alpha: return «alpha»;
}
} - I indekser er det forbudt at bruge operationen «,» («a[b,c]») på grund af uforudsigelig adfærd. Støtten til de fleste operationer med variabler, der er erklæret med nøgleordet volatile, er blevet afbrudt, herunder operationer «++» og «—» med standardtyper.
- Antallet af situationer, hvor det er nødvendigt at angive «typename» for at informere om tilstedeværelsen af en type, er blevet reduceret.
Kilde: opennet.ru
