Standard C++20 godkjent

ISO-komiteen for standardisering av programmeringsspråket C++ vedtatt internasjonale standard "C++20". Mulighetene som er presentert i spesifikasjonen, med unntak av enkelte tilfeller, bare i kompilatorer GCC, Clang og Microsoft Visual C++. Støttende C++20 standardbiblioteker er implementert innenfor prosjektet Boost.

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 nyheter.

Viktige i C++20 (kodeeksempler):

  • «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 utvidelse 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 P0722R1.
  • 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

Kjøp pålitelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere 🔥 Kjøp pålitelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere | ProHoster