A C++ nyelv szabványosításáért felelős ISO bizottság nemzetközi szabvány "". A specifikációban bemutatott lehetőségek, kivéve az egyedi eseteket, a fordítókban , és . A C++20 szabványos könyvtárak a projekt keretében valósultak meg .
A következő két hónapban a jóváhagyott specifikáció előkészítés alatt áll a közzételhez, amely során átmegy a helyesírási hibák és elgépelések szerkesztésén. November elején a dokumentum végleges változata eljut az ISO-hoz, ahol hivatalos néven ISO/IEC 14882:2020-ként publikálják. Eközben a bizottság már megkezdte a következő C++23 (C++2b) szabvány kidolgozását, amelynek legközelebbi virtuális ülésén megvitatják a lehetséges .
():
- Hozzáadták a "fogalmakat", amelyek lehetővé teszik a sablonparaméterek követelményeinek meghatározását, amelyek a fordítás során korlátozzák azokat az argumentumokat, amelyeket sablonparamétereként lehet fogadni. A fogalmakat logikai ellentmondások elkerülésére lehet alkalmazni az adat típusok, a sablonban használt, és a bemeneti paraméterek típusai között.
template
concept EqualityComparable = requires(T a, T b) {
{ a == b } -> std::boolean;
{ a != b } -> std::boolean;
}; - A modulokkal való munkához elfogadott helyettesíthetők a fejlécfájlok helyett. A modulok új módszert biztosítanak a forráskódok szervezésére az összetevők határainak meghatározása alapján, a "#include"-dal hozzátett fejlécfájlok nélkül.
- A __VA_OPT__ makró a variációs makrók adaptív kibővítéséhez a variációs argumentumban lévő tokenek függvényében.
- A háromtengelyű összehasonlításhoz szükséges operátor támogatása.
- Alapértelmezett elemek inicializálóinak támogatása bitmezők számára.
- Lambda kifejezések "*this"-re való elfogásának lehetősége.
struct int_value {
int n = 0;
auto getter_fn() {
// BAD:
// return [=]() { return n; };// GOOD:
return [=, *this]() { return n; };
}
}; - Elemek állandósítói (Pointer-to-member) hívása, amelyeket a "const &" kifejezésen keresztül határoznak meg ideiglenes objektumokkal.
- A delete operátor a dokumentumban leírt destruktorral, .
- Osztályok számára megengedett típusparaméterek használata típus nélkül.
struct foo {
foo() = default;
constexpr foo(int) {}
};template
auto get_foo() {
return f;
}get_foo(); // használja az implicit konstruktort
get_foo(); - Nem megőrzött lambda-kifejezések konstruktorral.
- A sablonok szintaxisának használatának lehetősége lambda-kifejezésekhez («auto f = [](std::vector v)»).
- A karakterláncok literáljainak használatának lehetősége sablonparaméterekben.
- A C-stílusú inicializálás szintaxisának támogatása — egyértelműen nem felsorolt mezők az inicializálási listában alapértelmezés szerint inicializálódnak.
struct A {
int x;
int y;
int z = 123;
};A a {.x = 1, .z = 2}; // a.x == 1, a.y == 0, a.z == 2
- Üres adattagok támogatása.
- A likely és unlikely attribútumok támogatása, amely tájékoztatja az optimalizálót a feltételes szerkezet valószínűségéről («[[likely]] if (random > 0) {«).
- A tartományok használatának lehetősége változók inicializálására a «for» ciklusban.
for (auto v = std::vector{1, 2, 3}; auto& e : v) {
- Tömb méretének automatikus meghatározása new paranccsal («new double[]{1,2,3}»);
- A „[[no_unique_address]]” attribútum, amely szerint az adat nélküli változók nem foglalnak helyet.
- Atomikus mutatók (std::atomic<shared_ptr> és std::atomic<weak_ptr>).
- Virtuális függvények hívásának lehetősége feltételes kifejezésekben.
- Gyors (immediate) függvények támogatása, amelyek csak konstansokkal működhetnek.
consteval int sqr(int n) {
return n * n;
}constexpr int r = sqr(100); // OK
int x = 100;
int r2 = sqr(x); // HIBA: ‘x’ nem használható konstansként - constexpr alkalmazásának lehetősége virtuális függvényekkel («constexpr virtual int f() const { return 2; }»).
- A standard könyvtárban:
- Hozzáadva a char8_t típus támogatása az UTF-8 karakterláncokhoz.
- Hozzáadva a bit (bitműveletek) és version fejléc-fájlok.
- Lehetőség a karakterláncok előtagjának és utótagjának ellenőrzésére (starts_with, ends_with).
- Hozzáadva az std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible és std::type_identity típusok.
- Hozzáadva az std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated és std::assume_aligned függvények.
- Az std::make_shared hozzáadta a tömbök támogatását.
- Hozzáadva az std::to_array funkció, hogy hasonló tömbszerű objektumokat std::array-re alakítson.
- Kényelmesebb szintaxis a felsorolásokhoz:
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»;
}
} - Az indexekben a " , " művelet használata tilos, mivel definiálatlan viselkedést okoz (" a[b,c] "). A volatile kulcsszóval deklarált változókkal végzett legtöbb művelet támogatása megszűnt, beleértve a szokásos típusokkal végzett " ++ " és " -- " műveleteket is.
- Csökkent a helyzetek száma, amikor a " typename " megadása szükséges a típus jelenlétének jelzésére.
Forrás: opennet.ru
