C++20-standarden er godkendt

ISO-komitéet for standardisering af C++-sproget godkendte den internationale standard «C++20«. De funktioner, der er præsenteret i specifikationen, med undtagelse af enkeltstående tilfælde, understøttes i kompilatorer GCC, Clang og Microsoft Visual C++. De standardbiblioteker, der understøtter C++20, er implementeret i projektet Boost.

I de kommende to måneder vil den godkendte specifikation være under forberedelse til offentliggørelse, hvor der vil blive arbejdet med redigering af stavefejl og typografiske fejl. I begyndelsen af november vil den endelige version af dokumentet blive sendt til ISO for offentliggørelse under det formelle navn ISO/IEC 14882:2020. Imens er udvalget allerede begyndt at arbejde på den næste standard C++23 (C++2b) og på det kommende virtuelle møde vil der blive drøftet mulige nyheder.

Vigtige funktioner C++20 (kodeeksempler):

  • «koncept» er blevet tilføjet, en udvidelse af skabeloner, der muliggør at definere et sæt krav til skabelonparametre, som ved kompilation begrænser det sæt argumenter, der kan accepteres som skabelonparametre. Koncepter kan anvendes for at undgå logiske uoverensstemmelser mellem egenskaberne af datatyper brugt inden for skabelonen, og egenskaberne af datatyper af indgangsparametre.

    template
    concept EqualityComparable = requires(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • En del af det vedtagne udvidelsen for arbejde med moduler, der kan anvendes i stedet for header-filer. Moduler giver en ny måde at organisere kildekoder baseret på definitionsgrænser for komponenter, uden headers inkluderet via "#include".
  • Makro __VA_OPT__ til adaptiv udrulning af variadiske makroer afhængigt af tilstedeværelsen af tokens i det variadiske argument.
  • Understøttelse af operatoren "" til tredobbelt sammenligning.
  • Understøttelse af standardelementinitialisatorer for bitfelter.
  • Mulighed for lambda-optagelse af udtryk "*this".

    struct int_value {
    int n = 0;
    auto getter_fn() {
    // BAD:
    // return [=]() { return n; };

    // GOOD:
    return [=, *this]() { return n; };
    }
    };

  • Kald af elementer ved pointer (Pointer-to-member), ved brug af defineret via udtrykket "const &" pegere til temporære objekter.
  • Delete-operator med destruktor beskrevet i dokumentet P0722R1.
  • Klasser tillades at bruge skabelonparametre uden type.

    struct foo {
    foo() = default;
    constexpr foo(int) {}
    };

    template
    auto get_foo() {
    return f;
    }

    get_foo(); // bruger implicit konstruktør
    get_foo();

  • Ikke gemte lambda-udtryk med konstruktør.
  • Muligheden for at bruge skabelonsyntaks til lambda-udtryk ("auto f = [](std::vector v)").
  • Muligheden for at bruge strenglitteraler som skabelonparametre.
  • Understøttelse af initialiseringssyntaks i C-stil — felter, der ikke eksplicit listes i initialiseringslisten, initialiseres til standardværdier.

    struct A {
    int x;
    int y;
    int z = 123;
    };

    A a {.x = 1, .z = 2}; // a.x == 1, a.y == 0, a.z == 2

  • Understøttelse af tomme medlemmer i datastrukturer.
  • Understøttelse af attributter likely og unlikely til at informere optimizeren om sandsynligheden for betingede udsagn ("[[likely]] if (random > 0) {").
  • Muligheden for at bruge intervaller til at initialisere variabelværdier i en "for"-løkke

    for (auto v = std::vector{1, 2, 3}; auto& e : v) {

  • Automatisk beregning af størrelse på array i new ("new double[]{1,2,3}");
  • Attributten "[[no_unique_address]]", hvor variabler uden data ikke optager plads.
  • Atomare pegepinde (std::atomic<shared_ptr> og std::atomic<weak_ptr>).
  • Muligheden for at kalde virtuelle funktioner i betingede udsagn.
  • Understøttelse af hurtige (immediate) funktioner, der kun kan arbejde med konstanter.

    consteval int sqr(int n) {
    return n * n;
    }

    constexpr int r = sqr(100); // OK
    int x = 100;
    int r2 = sqr(x); // ERROR: 'x' kan ikke bruges som konstant

  • Muligheden for at anvende constexpr med virtuelle funktioner ("constexpr virtual int f() const { return 2; }").
  • I standardbiblioteket:
    • Understøttelse af typen char8_t til UTF-8-strenge er blevet tilføjet.
    • Titelbibliotekerne bit (bitoperationer) og version er blevet tilføjet.
    • Mulighed for at kontrollere præfikser og suffikser for strenge (starts_with, ends_with).
    • Tilføjede metafunktions std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible og std::type_identity.
    • Tilføjede funktionerne std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated og std::assume_aligned.
    • Understøttelse af arrays er blevet tilføjet til std::make_shared.
    • Tilføjet funktionen std::to_array til at konvertere array-lignende objekter til std::array.
  • Mere bekvem syntaks for enumerationer:

    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";
    }
    }

  • Brugen af operationen «,» («a[b,c]») er forbudt i indeksene på grund af ubestemt adfærd. Støtten til de fleste operationer med variabler erklæret med nøgleordet volatile er ophørt, herunder er operationerne «++» og «—» for standardtyper forbudt.
  • 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

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster