Jóváhagyásra került a C++20 szabvány

A C++ nyelv szabványosításáért felelős ISO bizottság jóváhagyta nemzetközi szabvány "C++20". A specifikációban bemutatott lehetőségek, kivéve az egyedi eseteket, támogatottak a fordítókban GCC, Clang és Microsoft Visual C++. A C++20 szabványos könyvtárak a projekt keretében valósultak meg Boost.

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 újdonságok.

Fő jellemzői C++20 (kódsorokat):

  • 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 kiterjesztés 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, P0722R1.
  • 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

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster