C++20 standard heaks kiidetud

ISO C++ keele standardimise komitee heaks kiidetud rahvusvaheline standard"C ++ 20". Spetsifikatsioonis esitatud võimalused, välja arvatud üksikjuhud, toetatud koostajates GCC, Klähvima и Microsoft Visual C ++. Projekti raames rakendatakse C++20 toetavaid standardteeke Tõstmine.

Järgmise kahe kuu jooksul on kinnitatud spetsifikatsioon dokumendi avaldamiseks ettevalmistamise staadiumis, mille käigus tegeletakse kirja- ja kirjavigade toimetusliku parandamisega. Novembri alguses saadetakse saadud dokument avaldamiseks ISO-le ametliku nimetuse ISO/IEC 14882:2020 all. Vahepeal on komisjon juba alustanud tööd järgmise C++23 standardiga (C++2b) ja kaalub võimalikke valikuid järgmisel virtuaalsel koosolekul. uuendused.

Kõik Omadused C ++ 20 (koodi näited):

  • Lisatud "kontseptsioonid", mallilaiendid, mis võimaldavad teil määratleda malli parameetrite nõuete komplekti, mis kompileerimise ajal piiravad argumentide kogumit, mida saab malli parameetritena aktsepteerida. Mõisteid saab kasutada malli sees kasutatavate andmetüüpide omaduste ja sisendparameetrite andmetüübi omaduste vahel loogiliste vastuolude vältimiseks.

    malli
    mõiste VõrdlusVõrdlus = nõuab(T a, T b) {
    { a == b } -> std::tõve;
    { a != b } -> std::tõve;
    };

  • Vastu võetud laienemine moodulitega töötamiseks, mida saab kasutada päisefailide asemel. Moodulid pakuvad uut viisi lähtekoodi korraldamiseks, mis põhineb komponentide piiride määratlemisel, ilma päisefaile kaasamata “#include” kaudu.
  • Makro __VA_OPT__ muutuja makrode adaptiivseks laiendamiseks sõltuvalt muutuja argumendis olevate märkide olemasolust.
  • Operaatori "" tugi kolmesuunaliseks võrdluseks.
  • Tugi bitiväljade elementide vaikeinitsialiseerijatele.
  • Võimalus lambda jäädvustada "*see" väljendeid.

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

    // HEA:
    return [=, *see]() { return n; };
    }
    };

  • Elementide kutsumine kursori abil (pointer-to-member), kasutades viiteid ajutistele objektidele, mis on määratletud avaldise “const &” kaudu.
  • Kustutusoperaator koos dokumendis kirjeldatud hävitajaga P0722R1.
  • Klassidel on lubatud kasutada malli parameetreid ilma tüübita.

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

    malli
    auto get_foo() {
    tagastama f;
    }

    get_foo(); // kasutab kaudset konstruktorit
    get_foo ();

  • Mittepüsivad lambda-avaldised konstruktoriga.
  • Lambda-avaldiste malli süntaksi lubamine (“auto f = [] (std::vektor v)").
  • Võimalus kasutada malli parameetrites stringi literaale.
  • C-stiilis lähtestamise süntaksi tugi – lähtestamisloendis selgesõnaliselt loetlemata väljad lähtestatakse vaikimisi.

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

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

  • Tühjade andmestruktuuri liikmete tugi.
  • Tõenäoliste ja ebatõenäoliste atribuutide tugi, et teavitada optimeerijat tingimusliku konstruktsiooni käivitamise tõenäosusest (“[[tõenäoline]], kui (juhuslik > 0) {“).
  • Võimalus kasutada vahemikke muutujate väärtuste lähtestamiseks tsüklis "for".

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

  • Massiivi suuruse automaatne arvutamine uues (“new double[]{1,2,3}”);
  • Atribuut „[[no_unique_address]]”, milles ilma andmeteta muutujad ei võta ruumi.
  • Aatomiosutajad (std::atomic > ja std::atomic >).
  • Võimalus kutsuda virtuaalseid funktsioone tingimusavaldistes.
  • Toetus vahetutele funktsioonidele, mis töötavad ainult konstantidega.

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

    constexpr int r = sqr(100); // OKEI
    int x = 100;
    int r2 = sqr(x); // VIGA: 'x' ei saa kasutada konstantina

  • Võimalus kasutada constexpr virtuaalsete funktsioonidega (“constexpr virtual int f() const { return 2; }”).
  • Tavalises teegis:
    • Lisatud on UTF-8 stringide char8_t toetus.
    • Lisatud päisefailide bitt (bititoimingud) ja versioon.
    • Nüüd on võimalik kontrollida stringide ees- ja järelliidet (algab_koos, lõpeb_koos).
    • Lisatud std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible ja std::type_identity tunnused.
    • Lisatud funktsioonid std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated ja std::assume_aligned.
    • Massiivide tugi on lisatud failile std::make_shared.
    • Lisatud funktsioon std::to_array massiivilaadsete objektide teisendamiseks std::massiiviks.
  • Mugavam loendi süntaks:

    enum class rgba_color_channel { punane, roheline, sinine, alfa };

    std::string_view to_string(rgba_color_channel my_channel) {
    lüliti (minu_kanal) {
    kasutades enum rgba_color_channel;
    juhtum punane: tagastab "punane";
    juhtum roheline: tagastab "roheline";
    juhtum sinine: tagastab "sinine";
    juhtum alfa: tagastab "alfa";
    }
    }

  • Indeksites on määratlemata käitumise tõttu operatsiooni “,” (“a[b,c]”) kasutamine keelatud. Enamiku lenduva märksõnaga deklareeritud muutujatega toimingute tugi on lõpetatud, sealhulgas standardtüüpidega operatsioonide "++" ja "-" toetamine.
  • Vähendas olukordade arvu, kus tüübi olemasolu näitamiseks on nõutav "tüübinimi".

Allikas: opennet.ru

Lisa kommentaar