C++20-standardi hyväksytty

ISO C++ -kielen standardointikomitea hyväksytty kansainvälinen standardi "C ++ 20". Spesifikaatiossa esitetyt ominaisuudet yksittäisiä tapauksia lukuun ottamatta, tuettu kääntäjissä GCC, Kalahtaa и Microsoft Visual C ++. Hankkeessa toteutetaan C++20:tä tukevat standardikirjastot edistää.

Seuraavan kahden kuukauden aikana hyväksytty spesifikaatio on asiakirjan julkaisuvaiheessa, jossa tehdään kirjoitus- ja kirjoitusvirheiden toimituksellista korjausta. Marraskuun alussa tuloksena oleva asiakirja lähetetään ISO:lle julkaistavaksi virallisella nimellä ISO/IEC 14882:2020. Sillä välin valiokunta on jo aloittanut seuraavan C++23-standardin (C++2b) työskentelyn ja harkitsee mahdollisia vaihtoehtoja seuraavassa virtuaalikokouksessaan. innovaatioita.

Pääasiallinen ominaisuudet C ++ 20 (koodiesimerkkejä):

  • Lisätty "käsitteitä", laajennuksia malleihin, joiden avulla voit määrittää joukon malliparametrivaatimuksia, jotka käännöshetkellä rajoittavat argumenttien määrää, jotka voidaan hyväksyä malliparametreiksi. Käsitteitä voidaan käyttää välttämään loogisia epäjohdonmukaisuuksia mallissa käytettyjen tietotyyppien ominaisuuksien ja syöteparametrien tietotyyppiominaisuuksien välillä.

    sapluuna
    käsite EqualityComparable = vaatii(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Hyväksytty laajeneminen moduulien kanssa työskentelemiseen, joita voidaan käyttää otsikkotiedostojen sijasta. Moduulit tarjoavat uuden tavan järjestää lähdekoodia komponenttien rajojen määrittämisen perusteella ilman, että otsikkotiedostoja sisällytetään "#include" -komennolla.
  • Makro __VA_OPT__ muuttujamakrojen mukautuvaan laajentamiseen riippuen muuttuja-argumentissa olevien merkkien läsnäolosta.
  • Tuki operaattorille "" kolmisuuntaista vertailua varten.
  • Tuki bittikenttien oletuselementtien alustajille.
  • Kyky lambda kaapata "*this"-lausekkeet.

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

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

  • Elementtien kutsuminen osoittimella (Pointer-to-member), käyttämällä osoittimia väliaikaisiin objekteihin, jotka on määritelty "const &" -lausekkeella.
  • Poista-operaattori asiakirjassa kuvatulla tuhoajalla P0722R1.
  • Luokat saavat käyttää malliparametreja ilman tyyppiä.

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

    sapluuna
    auto get_foo() {
    paluu f;
    }

    get_foo(); // käyttää implisiittistä konstruktoria
    get_foo ();

  • Ei-pysyvät lambda-lausekkeet konstruktorilla.
  • Sallitaan mallisyntaksi lambda-lausekkeille ("auto f = [] (std::vektori v)").
  • Kyky käyttää merkkijonoliteraaaleja malliparametreissa.
  • Tuki C-tyyliselle alustussyntaksille – kentät, joita ei ole nimenomaisesti lueteltu alustusluettelossa, alustetaan oletusarvoisesti.

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

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

  • Tuki tyhjille tietorakenteen jäsenille.
  • Tuki todennäköisille ja epätodennäköisille attribuuteille, jotka ilmoittavat optimoijalle ehdollisen rakenteen käynnistymisen todennäköisyydestä ("[[todennäköinen]] if (random > 0) {").
  • Mahdollisuus käyttää alueita muuttujien arvojen alustamiseen "for"-silmukassa

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

  • Automaattinen taulukon koon laskenta uudessa muodossa ("new double[]{1,2,3}");
  • [[no_unique_address]]-attribuutti, jossa muuttujat ilman dataa eivät vie tilaa.
  • Atomiosoittimet (std::atomic > ja std::atomic >).
  • Kyky kutsua virtuaalisia toimintoja ehdollisissa lausekkeissa.
  • Tuki välittömille funktioille, jotka voivat toimia vain vakioiden kanssa.

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

    constexpr int r = sqr(100); // OK
    int x = 100;
    int r2 = sqr(x); // VIRHE: 'x' ei voi käyttää vakiona

  • Mahdollisuus käyttää constexpr virtuaalifunktioiden kanssa ("constexpr virtual int f() const { return 2; }").
  • Vakiokirjastossa:
    • Lisätty tuki char8_t-tyypille UTF-8-merkkijonoille.
    • Lisätty otsikkotiedostojen bitti (bittitoiminnot) ja versio.
    • Nyt on mahdollista tarkistaa merkkijonojen etuliite ja pääte (alkaa_kanssa, loppuu_kanssa).
    • Lisätty std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible ja std::type_identity-ominaisuudet.
    • Lisätty funktiot std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated ja std::oletetaan_aligned.
    • Lisätty tuki taulukoille std::make_shared.
    • Lisätty std::to_array-funktio, joka muuntaa taulukon kaltaiset objektit std::arrayiksi.
  • Kätevämpi luettelointisyntaksi:

    enum class rgba_color_channel { punainen, vihreä, sininen, alfa };

    std::string_view to_string(rgba_color_channel my_channel) {
    vaihda (my_channel) {
    käyttäen enum rgba_color_channel;
    tapaus punainen: palauta "punainen";
    kotelo vihreä: palauta "vihreä";
    kotelo sininen: palauta "sininen";
    case alfa: palauttaa "alpha";
    }
    }

  • Indekseissa operaatio "," ("a[b,c]") on kielletty määrittelemättömän toiminnan vuoksi. Useimpien toimintojen, joissa muuttujat on ilmoitettu volatile-avainsanalla, tuki on lopetettu, mukaan lukien "++"- ja "-"-toiminnot vakiotyypeillä.
  • Vähensi niiden tilanteiden määrää, joissa "typename" vaaditaan osoittamaan tyypin olemassaolo.

Lähde: opennet.ru

Lisää kommentti