C++20 estandarra onartua

C++ Hizkuntzaren Normalizaziorako ISO Batzordea onartua nazioarteko estandarra"C ++ 20". Zehaztapenean aurkezten diren gaitasunak, kasu isolatuak izan ezik, onartzen konpiladoreetan GCC, Deika и Microsoft Visual C ++. C++20 onartzen duten liburutegi estandarrak inplementatzen dira proiektuaren barruan Boost.

Datozen bi hilabeteetan, onartutako zehaztapena argitalpenerako dokumentua prestatzeko fasean egongo da, eta akats ortografikoen eta akatsen erredakzio-zuzenketa lanetan egingo da. Azaroaren hasieran, ondoriozko dokumentua ISOra bidaliko da ISO/IEC 14882:2020 izen formalarekin argitaratzeko. Bitartean, batzordea dagoeneko hasi da hurrengo C++23 estandarra (C++2b) lantzen eta hurrengo bilera birtualean aukera posibleak aztertuko ditu. berrikuntzak.

Nagusia Ezaugarriak C ++ 20 (kode adibideak):

  • "Kontzeptuak" gehitu dira, txantiloi-luzapenak, txantiloi-parametro-eskakizunen multzoa definitzeko aukera ematen dutenak, konpilazio garaian txantiloi-parametro gisa onar daitezkeen argumentu-multzoa mugatzen dutenak. Kontzeptuak txantiloiaren barruan erabiltzen diren datu-moten propietateen eta sarrera-parametroen datu-moten propietateen arteko inkoherentzia logikoak saihesteko erabil daitezke.

    txantiloia
    kontzeptua BerdintasunaKonparagarria = eskatzen du(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Onartua hedapen goiburuko fitxategien ordez erabil daitezkeen moduluekin lan egiteko. Moduluek iturburu kodea antolatzeko modu berri bat eskaintzen dute osagaien mugak definitzean oinarrituta, "#include" bidez goiburuko fitxategiak sartu gabe.
  • Makro __VA_OPT__ makro aldagaien hedapen egokirako, argumentu aldagaian token presentziaren arabera.
  • Hiru norabideko konparaziorako "" operadorearen laguntza.
  • Bit-eremuetarako elementu lehenetsien hasierako laguntza.
  • "*hau" esamoldeak lambda harrapatzeko gaitasuna.

    egitura int_balioa {
    int n = 0;
    auto getter_fn() {
    //TXARRA:
    // itzuli [=]() { itzuli n; };

    // ONDO:
    itzuli [=, *hau]() { itzuli n; };
    }
    };

  • Erakuslearen bidez elementuak deitzea (Erakusletik kidera), “const &” adierazpenaren bidez definitutako aldi baterako objektuetarako erakusleak erabiliz.
  • Dokumentuan deskribatutako suntsitzaile batekin ezabatzeko operadorea P0722R1.
  • Klaseek txantiloi-parametroak motarik gabe erabiltzeko baimena dute.

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

    txantiloia
    auto get_foo() {
    itzuli f;
    }

    lortu_foo(); // eraikitzaile inplizitua erabiltzen du
    lortu_foo ();

  • Lambda adierazpen iraunkorrak eraikitzailearekin.
  • Lambda adierazpenetarako txantiloiaren sintaxia baimentzea ("auto f = [] (std::bektorea v)").
  • Txantiloi-parametroetan kate literalak erabiltzeko gaitasuna.
  • C estiloko hasierako sintaxirako laguntza - hasierako zerrendan esplizituki agertzen ez diren eremuak lehenespenez hasieratzen dira.

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

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

  • Datuen egitura hutseko kideentzako laguntza.
  • Optimizatzaileari baldintzazko konstruktua abiarazteko probabilitateari buruz informatzeko atributu litekeena eta nekezaren euskarria (“[[litekeena]] bada (ausazkoa > 0) {“).
  • Barrutiak erabiltzeko gaitasuna "for" begizta batean balio aldagaiak hasieratzeko

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

  • Array-tamainaren kalkulu automatikoa berrian ("bikoitza berria[]{1,2,3}");
  • “[[no_unique_address]]” atributuak, non daturik gabeko aldagaiek lekurik hartzen ez duten.
  • Erakusle atomikoak (std::atomic > eta std::atomic >).
  • Baldintzazko adierazpenetan funtzio birtualak deitzeko gaitasuna.
  • Konstanteekin soilik lan egin dezaketen berehalako funtzioetarako laguntza.

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

    constexpr int r = sqr (100); // ADOS
    int x = 100;
    int r2 = sqr(x); // ERROREA: 'x' ezin da konstante gisa erabili

  • Funtzio birtualekin constexpr erabiltzeko aukera (“constexpr virtual int f() const { return 2; }”).
  • Liburutegi estandarrean:
    • Char8_t motarako laguntza gehitu da UTF-8 kateetarako.
    • Goiburuko fitxategiak bit (bit eragiketak) eta bertsioa gehitu dira.
    • Orain kateen aurrizkia eta atzizkia egiaztatzeko aukera dago (hasieran_hasieran, amaitzen dena).
    • Gehitu dira std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible eta std::type_identity ezaugarriak.
    • Gehitutako funtzioak std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated eta std::assume_aligned.
    • Std::make_shared-en matrizeentzako laguntza gehitu da.
    • Std::to_array funtzioa gehitu da array antzeko objektuak std::array bihurtzeko.
  • Zenbaketa sintaxi erosoagoa:

    enum klasea rgba_color_channel {gorria, berdea, urdina, alfa};

    std::string_view to_string(rgba_color_channel nire_kanala) {
    aldatu (nire_kanala) {
    enum rgba_color_channel erabiliz;
    case red: itzuli "gorria";
    case green: itzuli "berdea";
    kasu urdina: itzuli "urdina";
    case alpha: itzuli "alpha";
    }
    }

  • Indizeetan, zehaztu gabeko portaera dela eta, debekatuta dago “,” (“a[b,c]”) eragiketa erabiltzea. Gako-hitz lurrunkorrarekin deklaratutako aldagaien eragiketa gehienetarako laguntza eten egin da, mota estandarrak dituzten “++” eta “—” eragiketak barne.
  • Mota baten presentzia adierazteko "typename" behar den egoera kopurua murriztu da.

Iturria: opennet.ru

Gehitu iruzkin berria