Apstiprināts standarts C++20

ISO komiteja par C++ valodas standartizāciju apstiprināja starptautiskais standarts «C++20«. Specifikācijā sniegtās iespējas, izņemot vienkāršos gadījumus, atbalstīti kompilatoros GCC, Clang un Microsoft Visual C++. C++20 standartam atbilstošās bibliotēkas ir implementētas projekta ietvaros Boost.

Nākamajos divos mēnešos apstiprinātā specifikācija atradīsies dokumenta sagatavošanas posmā pirms publicēšanas, kura laikā tiks veikta redaktora pārbaude pareizrakstības kļūdām un drukas kļūdām. Novembra sākumā gala dokuments tiks nosūtīts ISO publicēšanai ar oficiālo nosaukumu ISO/IEC 14882:2020. Tikmēr komiteja jau ir sākusi darbu pie nākamā standarta C++23 (C++2b) un tuvākajā virtuālajā sanāksmē tiks apspriesti iespējamie jaunumi.

īpašības QUIC: C++20 (koda piemēri):

  • Pievienotas «koncepcijas», veidņu paplašinājumi, kas ļauj noteikt prasību kopumu, kas attiecībā uz veidņu parametriem ierobežo argumentu kopu, ko var pieņemt kā veidņu parametrus. Koncepcijas var izmantot, lai izvairītos no loģiskiem nepilnības gadījumiem starp datu tipu īpašībām, kas tiek izmantotas veidnē, un datu tipu īpašībām, kas tiek nodotas kā ieejas parametri.

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

  • Tika pieņemti paplašinājums moduļi, kurus var izmantot vietā, kur parasti izmanto galvenes failus. Moduļi piedāvā jaunu veidu, kā organizēt avota kodus, balstoties uz komponentu robežu definēšanu, bez nepieciešamības iekļaut galvenes failus ar «#include».
  • Makros __VA_OPT__ adaptīvai variācijas makro atklāšanai atkarībā no tā, vai mainīgajā argumentā ir simboli.
  • Atbalsts operatoram «» trīsoņu salīdzināšanai.
  • Atbalsts noklusējuma elementu inicializatoriem bitu laukiem.
  • Iespēja lambda izteiksmju «*this» satveršanai.

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

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

  • Elementu izsaukšana pēc rādītāja (Pointer-to-member), izmantojot izteiksmē «const &» definētus rādītājus uz pagaidu objektiem.
  • Delete operators ar destruktors, kas aprakstīts dokumentā P0722R1.
  • Klases drīkst izmantot veidņu parametrus bez tipa.

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

    template
    auto get_foo() {
    return f;
    }

    get_foo(); // izmanto implicitconstructor
    get_foo();

  • Nesaglabāmi lambda izteikumi ar konstruktoru.
  • Šablonu sintakses izmantošanas pieļaujamība lambda izteikumiem («auto f = [<typename T>(std::vector<T> v)»).
  • Iespēja izmantot virkņu literāļus šablona parametros.
  • Atbalsts C stilā - kārtām, kas nav skaidri uzskaitītas inicializācijas sarakstā, tiek inicializētas ar noklusējuma vērtībām.

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

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

  • Atbalsts tukšiem datu struktūru ločekļiem.
  • Atbalsts likely un unlikely atribūtiem, lai informētu optimizētāju par nosacījumu izpildes varbūtību («[[likely]] if (random > 0) {»).
  • Iespēja izmantot diapazonus, lai inicializētu mainīgā vērtības for ciklā.

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

  • Automātiska masīva lieluma aprēķināšana new («new double[]{1,2,3}»);
  • Atribūts «[[no_unique_address]]», kad bez datu mainīgie neaizņem vietu.
  • Atomārie rādītāji (std::atomic<shared_ptr<T>> un std::atomic<weak_ptr<T>>).
  • Iespēja izsaukt virtuālās funkcijas nosacījuma izteiksmēs.
  • Atbalsts tūlītējām funkcijām, kas var darboties tikai ar konstantēm.

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

    constexpr int r = sqr(100); // OK
    int x = 100;
    int r2 = sqr(x); // KĻŪDA: 'x' nevar izmantot kā konstanti

  • Iespēja izmantot constexpr ar virtuālām funkcijām («constexpr virtual int f() const { return 2; }»).
  • Standartbibliotēkā:
    • Pievienots atbalsts char8_t tipam UTF-8 virkņu atbalstam.
    • Pievienoti bit (bitu operācijas) un version galveni.
    • Iespēja pārbaudīt virkņu prefiksus un sufiksus (starts_with, ends_with).
    • Pievienoti tipi std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible un std::type_identity.
    • Pievienotas funkcijas std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated un std::assume_aligned.
    • std::make_shared pievienots atbalsts masīviem.
    • Pievienota funkcija std::to_array, lai pārvērstu masīvveida objektus std::array.
  • Viegli lietojams enum sintakse:

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

  • Indeksos dēļ nenoteiktas uzvedības ir aizliegta operācijas «,» («a[b,c]») izmantošana. Atbalsts lielākajai daļai operāciju ar mainīgajiem, kas pasludināti ar atslēgvārdu volatile, ir pārtraukts, tostarp aizliegtas operācijas «++» un «—» ar standarta tipiem.
  • Samazināts situāciju skaits, kurās nepieciešams norādīt «typename», lai informētu par tipa esamību.

Avots: opennet.lv

Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem 🔥 Iegādājieties uzticamu tīmekļa hostingu ar DDoS aizsardzību, VPS VDS serveriem | ProHoster