C++20 staðall samþykktur

ISO nefnd um stöðlun á C++ tungumálinu samþykkt alþjóðlegur staðall"C ++ 20". Getan sem kynnt er í forskriftinni, að undanskildum einstökum tilvikum, studd í þýðendum GCC, Klangur и Microsoft Visual C ++. Stöðluð bókasöfn sem styðja C++20 eru innleidd innan verkefnisins Uppörvun.

Á næstu tveimur mánuðum verður samþykkt forskrift á stigi útgáfu skjalsins þar sem unnið verður að ritstjórnarleiðréttingu á stafsetningarvillum og innsláttarvillum. Snemma í nóvember verður skjalið sem verður sent til ISO til birtingar undir formlegu nafni ISO/IEC 14882:2020. Í millitíðinni hefur nefndin þegar hafið vinnu við næsta C++23 staðal (C++2b) og mun skoða mögulega kosti á næsta sýndarfundi. nýjungar.

Helstu Features C ++ 20 (kóða dæmi):

  • Bætt við „hugtökum“, sniðmátsviðbótum, sem gerir þér kleift að skilgreina sett af kröfum um sniðmátsfæribreytur sem, á tímasetningu, takmarka mengi röksemda sem hægt er að samþykkja sem sniðmátsfæribreytur. Hugtökin er hægt að nota til að forðast rökrétt ósamræmi milli eiginleika gagnategundanna sem notaðar eru innan sniðmátsins og gagnategundareiginleika inntaksbreytanna.

    sniðmát
    hugtak JafnréttiSambærilegt = krefst(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Samþykkt viðbyggingar til að vinna með einingar sem hægt er að nota í stað hausskráa. Einingar bjóða upp á nýja leið til að skipuleggja frumkóða byggt á því að skilgreina mörk íhluta, án þess að innihalda hausskrár með „#include“.
  • Fjölvi __VA_OPT__ fyrir aðlögunarstækkun breytilegra fjölva eftir tilvist tákna í breytuviðfanginu.
  • Stuðningur við "" rekstraraðila fyrir þríhliða samanburð.
  • Stuðningur við sjálfgefna frumstillingu frumefna fyrir bitasvið.
  • Geta til að lambda fanga "*þetta" tjáningu.

    struct int_value {
    int n = 0;
    auto getter_fn() {
    //SLÆMT:
    // skila [=]() { skila n; };

    // GÓÐUR:
    skila [=, *þetta]() { skila n; };
    }
    };

  • Kalla á þætti með bendili (Bendi til meðlims), með því að nota ábendingar á tímabundna hluti sem eru skilgreindir með „const &“ tjáningu.
  • Eyða rekstraraðili með eyðingarbúnaði sem lýst er í skjalinu P0722R1.
  • Bekkjum er heimilt að nota sniðmátsfæribreytur án tegundar.

    struct foo {
    foo() = sjálfgefið;
    constexpr foo(int) {}
    };

    sniðmát
    auto get_foo() {
    skila f;
    }

    get_foo(); // notar óbeina smiðju
    get_foo ();

  • Óviðvarandi lambda tjáning með smiði.
  • Leyfir setningafræði sniðmáts fyrir lambda tjáning ("auto f = [] (std::vektor v)").
  • Geta til að nota strengjabókstafi í sniðmátsbreytum.
  • Stuðningur við frumsetningarsetningafræði í C-stíl - reitir sem ekki eru sérstaklega skráðir á frumstillingarlistanum eru sjálfgefið frumstilltir.

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

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

  • Stuðningur við tóma gagnaskipulagsmeðlimi.
  • Stuðningur við líklega og ólíklega eiginleika til að upplýsa fínstillingarmanninn um líkurnar á því að skilyrta smíðin verði ræst ("[[líklegt]] ef (tilviljun > 0) {“).
  • Geta til að nota svið til að frumstilla breytugildi í „fyrir“ lykkju

    fyrir (sjálfvirkt v = std::vektor{1, 2, 3}; sjálfvirkt& e: v) {

  • Sjálfvirkur útreikningur á fylkisstærð í nýjum („nýr tvöfaldur[]{1,2,3}“);
  • Eigindin „[[ekkert_einstakt_address]]“ þar sem breytur án gagna taka ekki pláss.
  • Atómvísar (std::atomic > og std::atóm >).
  • Geta til að kalla sýndaraðgerðir í skilyrtum tjáningum.
  • Stuðningur við tafarlausar aðgerðir sem geta aðeins unnið með fasta.

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

    constexpr int r = sqr(100); // Allt í lagi
    int x = 100;
    int r2 = sqr(x); // VILLA: 'x' er ekki hægt að nota sem fasta

  • Möguleiki á að nota constexpr með sýndaraðgerðum ("constexpr virtual int f() const { return 2; }").
  • Í venjulegu bókasafni:
    • Bætti við stuðningi við gerð char8_t fyrir UTF-8 strengi.
    • Bætti við hausskrárbita (bitaaðgerðum) og útgáfu.
    • Nú er hægt að athuga forskeyti og viðskeyti strengja (byrjar_með, endar_með).
    • Bætt við std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible og std::type_identity eiginleikum.
    • Bætt við föllum std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated og std::assume_aligned.
    • Bætti við stuðningi fyrir fylki við std::make_shared.
    • Bætt við std::to_array falli til að umbreyta fylkislíkum hlutum í std::array.
  • Þægilegri upptalning setningafræði:

    enum flokkur rgba_color_channel {rauður, grænn, blár, alfa};

    std::string_view to_string(rgba_color_channel my_channel) {
    skipta (mín_rás) {
    nota enum rgba_color_channel;
    rautt mál: skila „rautt“;
    case green: skila "grænt";
    blátt mál: skila "bláu";
    case alpha: skila "alfa";
    }
    }

  • Í vísitölum, vegna óskilgreindrar hegðunar, er notkun aðgerðarinnar "," ("a[b,c]") bönnuð. Stuðningur við flestar aðgerðir með breytum sem lýst er yfir með hinu rokgjarna leitarorði hefur verið hætt, þar á meðal „++“ og „—“ aðgerðirnar með stöðluðum gerðum.
  • Fækkaði fjölda aðstæðna þar sem "tegundarheiti" er krafist til að gefa til kynna tilvist tegundar.

Heimild: opennet.ru

Bæta við athugasemd