Apstiprināts C++20 standarts

ISO C++ valodas standartizācijas komiteja apstiprināts starptautiskais standarts"C ++ 20". Specifikācijā norādītās iespējas, izņemot atsevišķus gadījumus, atbalstīts kompilatoros GCC, Klans и Microsoft Visual C ++. Projekta ietvaros tiek ieviestas standarta bibliotēkas, kas atbalsta C++20 Palielināt.

Nākamo divu mēnešu laikā apstiprinātā specifikācija būs dokumenta sagatavošanas stadijā publicēšanai, kurā tiks veikts darbs pie pareizrakstības kļūdu un drukas kļūdu redakcionālas labošanas. Novembra sākumā iegūtais 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ā C++23 standarta (C++2b) un izskatīs iespējamās iespējas nākamajā virtuālajā sanāksmē. jauninājumiem.

Galvenais Features C ++ 20 (kodu piemēri):

  • Pievienoti "jēdzieni", veidņu paplašinājumi, kas ļauj definēt veidnes parametru prasību kopu, kas kompilēšanas laikā ierobežo argumentu kopu, ko var pieņemt kā veidnes parametrus. Jēdzienus var izmantot, lai izvairītos no loģiskām pretrunām starp veidnē izmantoto datu tipu īpašībām un ievades parametru datu tipa īpašībām.

    veidne
    jēdziens VienlīdzībaSalīdzināms = prasa(T a, T b) {
    {a == b} -> std::būla;
    {a != b } -> std::būla;
    };

  • Pieņemts paplašināšana darbam ar moduļiem, kurus var izmantot galvenes failu vietā. Moduļi nodrošina jaunu veidu, kā organizēt pirmkodu, pamatojoties uz komponentu robežu noteikšanu, neiekļaujot galvenes failus, izmantojot “#include”.
  • Makro __VA_OPT__ mainīgo makro adaptīvai paplašināšanai atkarībā no marķieru klātbūtnes mainīgā argumentā.
  • Atbalsts operatoram "" trīsvirzienu salīdzināšanai.
  • Atbalsts noklusējuma elementu inicializatoriem bitlaukiem.
  • Spēja lambda uztvert "*this" izteicienus.

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

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

  • Elementu izsaukšana pēc rādītāja (norādītājs uz dalībnieku), izmantojot norādes uz pagaidu objektiem, kas definēti, izmantojot izteiksmi “const &”.
  • Dzēšanas operators ar dokumentā aprakstīto destruktoru P0722R1.
  • Klasēm ir atļauts izmantot veidņu parametrus bez veida.

    struct foo {
    foo() = noklusējuma;
    constexpr foo(int) {}
    };

    veidne
    auto get_foo() {
    atgriezties f;
    }

    get_foo(); // izmanto implicītu konstruktoru
    get_foo ();

  • Nenoturīgas lambda izteiksmes ar konstruktoru.
  • Tiek atļauta veidnes sintakse lambda izteiksmēm (“auto f = [] (std::vector v)").
  • Spēja izmantot stīgu literāļus veidņu parametros.
  • Atbalsts C stila inicializācijas sintaksei — lauki, kas nav skaidri norādīti inicializācijas sarakstā, tiek inicializēti pēc noklusējuma.

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

    A a {.x = 1, .z = 2}; // ax == 1, ay == 0, az == 2

  • Atbalsts tukšiem datu struktūras dalībniekiem.
  • Iespējamo un maz ticamo atribūtu atbalsts, lai informētu optimizētāju par nosacījuma konstrukcijas aktivizēšanas iespējamību (“[[iespējams]], ja (nejauši > 0) {“).
  • Iespēja izmantot diapazonus, lai inicializētu mainīgās vērtības "for" cilpā

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

  • Automātisks masīva lieluma aprēķins jaunā (“new double[]{1,2,3}”);
  • Atribūts “[[no_unique_address]]”, kurā mainīgie bez datiem neaizņem vietu.
  • Atomu norādes (std::atomic > un std::atomic >).
  • Spēja izsaukt virtuālās funkcijas nosacījuma izteiksmēs.
  • Atbalsts tūlītējām funkcijām, kuras var darboties tikai ar konstantēm.

    consteval int sqr(int n) {
    atgriešanās n * n;
    }

    constexpr int r = sqr(100); // LABI
    int x = 100;
    int r2 = kvadrāts(x); // KĻŪDA: “x” nevar izmantot kā konstanti

  • Iespēja izmantot constexpr ar virtuālajām funkcijām (“constexpr virtual int f() const { return 2; }”).
  • Standarta bibliotēkā:
    • Pievienots UTF-8 virkņu tipa char8_t atbalsts.
    • Pievienots galvenes failu bits (bitu darbības) un versija.
    • Tagad ir iespējams pārbaudīt virkņu prefiksu un sufiksu (sākas_ar, beidzas_ar).
    • Pievienotas std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible un std::type_identity iezīmes.
    • Pievienotas funkcijas std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated un std::assume_aligned.
    • Pievienots masīvu atbalsts std::make_shared.
    • Pievienota funkcija std::to_array, lai masīvam līdzīgus objektus pārvērstu par std::masīvu.
  • Ērtāka uzskaitīšanas sintakse:

    enum class rgba_color_channel { sarkans, zaļš, zils, alfa};

    std::string_view to_string(rgba_color_channel my_channel) {
    slēdzis (mans_kanāls) {
    izmantojot enum rgba_color_channel;
    gadījums sarkans: atgriezt "sarkans";
    korpuss zaļš: atgriezt "zaļš";
    korpuss zils: atgriezt "zils";
    case alfa: atgriešanās "alfa";
    }
    }

  • Indeksos nedefinētas uzvedības dēļ ir aizliegts izmantot operāciju “,” (“a[b,c]”). Ir pārtraukts atbalsts lielākajai daļai operāciju ar mainīgajiem, kas deklarēti ar nepastāvīgu atslēgvārdu, tostarp operācijām “++” un “-” ar standarta tipiem.
  • Samazināts to situāciju skaits, kurās ir nepieciešams "tipa nosaukums", lai norādītu uz veida klātbūtni.

Avots: opennet.ru

Pievieno komentāru