C++20-normo aprobita

ISO-Komitato pri Normigado de la Lingvo C++ aprobita internacia normo"C ++ 20". La kapabloj prezentitaj en la specifo, kun la escepto de izolitaj kazoj, apogita en kompililoj GCC, clang и Microsoft Vida C ++. Normaj bibliotekoj apogantaj C++20 estas efektivigitaj ene de la projekto akcelon.

En la venontaj du monatoj, la aprobita specifo estos en la stadio de preparado de la dokumento por publikigo, ĉe kiu laboro estos farita pri redakcia korekto de literumaj eraroj kaj tajperaroj. Komence de novembro, la rezulta dokumento estos sendita al ISO por publikigo sub la formala nomo ISO/IEC 14882:2020. Intertempe, la komitato jam komencis labori pri la venonta C++23-normo (C++2b) kaj konsideros eblajn opciojn en sia venonta virtuala kunveno. novigoj.

Ĉefa Karakterizaĵoj C ++ 20 (kodaj ekzemploj):

  • Aldonitaj "konceptoj", ŝablonaj etendoj, kiuj ebligas al vi difini aron da ŝablonaj parametropostuloj kiuj, en la tempo de kompilo, limigas la aron da argumentoj kiuj povas esti akceptitaj kiel ŝablonaj parametroj. La konceptoj povas esti utiligitaj por eviti logikajn faktkonfliktojn inter la trajtoj de la datumtipoj uzitaj ene de la ŝablono kaj la datumtiptrajtoj de la enirparametroj.

    ŝablono
    koncepto EgalecoKomparebla = postulas(T a, T b) {
    { a == b } -> std::bulean;
    { a != b } -> std::bulean;
    };

  • Akceptita pligrandigo por labori kun moduloj uzeblaj anstataŭ titolaj dosieroj. Moduloj provizas novan manieron organizi fontkodon bazitan sur difinado de la limoj de komponantoj, sen inkluzivi kapdosierojn per "#include".
  • Makroo __VA_OPT__ por adapta ekspansio de variaj makrooj depende de la ĉeesto de ĵetonoj en la varia argumento.
  • Subteno por la "" funkciigisto por tridirekta komparo.
  • Subteno por defaŭltaj element-komencigiloj por bitkampoj.
  • Kapablo lambda kapti "*this" esprimojn.

    struct int_valoro {
    int n = 0;
    aŭtomata getter_fn () {
    // MALBONA:
    // return [=]() { return n; };

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

  • Voki elementojn per montrilo (Montrilo-al-membro), uzante montrilojn al provizoraj objektoj difinitaj per la "konst &" esprimo.
  • La forigita operatoro kun detruanto priskribita en la dokumento P0722R1.
  • Klasoj rajtas uzi ŝablonajn parametrojn sen tipo.

    struct foo {
    foo() = defaŭlta;
    constexpr foo(int) {}
    };

    ŝablono
    aŭtomate get_foo () {
    reveni f;
    }

    get_foo(); // uzas implican konstruilon
    get_foo();

  • Ne-daŭraj lambdaj esprimoj kun konstrukciisto.
  • Permesas la uzon de ŝablonsintakso por lambda esprimoj ("auto f = [](std::vector v)").
  • Kapablo uzi ĉenajn literalojn en ŝablonaj parametroj.
  • Subteno por C-stila inicialigsintakso - kampoj ne eksplicite listigitaj en la inicialiglisto estas pravigitaj defaŭlte.

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

    A a {.x = 1, .z = 2}; // a.x == 1, a.y == 0, a.z == 2

  • Subteno por malplenaj datumstrukturmembroj.
  • Subteno por la verŝajnaj kaj neverŝajnaj atributoj por informi la optimumiganton pri la probableco de la kondiĉa konstrukcio esti ekigita ("[[verŝajna]] se (hazarda > 0) {“).
  • Kapablo uzi gamojn por pravalorigi variajn valorojn en "por" buklo

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

  • Aŭtomata kalkulo de tabelo en nova ("nova duobla[]{1,2,3}");
  • La atributo “[[no_unique_address]]” en kiu variabloj sen datumoj ne okupas spacon.
  • Atommontriloj (std::atomic> kaj std::atomic>).
  • Kapablo voki virtualajn funkciojn en kondiĉaj esprimoj.
  • Subteno por tujaj funkcioj, kiuj povas funkcii nur kun konstantoj.

    konsteval int sqr(int n) {
    reveni n * n;
    }

    constexpr int r = sqr(100); // BONE
    int x = 100;
    int r2 = sqr(x); // ERARO: 'x' ne povas esti uzata kiel konstanto

  • Eblo uzi constexpr kun virtualaj funkcioj (“constexpr virtual int f() const { return 2; }”).
  • En la norma biblioteko:
    • Aldonita subteno por la char8_t-tipo por UTF-8-ĉenoj.
    • Aldonita kapdosieroj bit (bit operacioj) kaj versio.
    • Nun eblas kontroli la prefikson kaj sufikson de ĉenoj (komencas_per, finiĝas_per).
    • Aldonitaj std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible kaj std::type_identity.
    • Aldonitaj funkcioj std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated kaj std::assume_aligned.
    • Aldonita subteno por tabeloj al std::make_shared.
    • Aldonita std::to_array funkcio por konverti tabel-similajn objektojn al std::array.
  • Pli oportuna nombra sintakso:

    enum klaso rgba_color_channel { ruĝa, verda, blua, alfa };

    std::string_view to_string(rgba_color_channel mia_kanalo) {
    ŝanĝi (mia_kanalo) {
    uzante enum rgba_color_channel;
    case red: return "ruĝa";
    case green: return "verda";
    case blue: return "blua";
    case alpha: redonu "alfa";
    }
    }

  • En indeksoj, pro nedifinita konduto, la uzo de la operacio “,” (“a[b,c]”) estas malpermesita. Subteno por plej multaj operacioj kun variabloj deklaritaj per la volatila ŝlosilvorto estis nuligita, inkluzive de la "++" kaj "—" operacioj kun normaj tipoj.
  • Reduktis la nombron da situacioj en kiuj "tiponomo" estas postulata por indiki la ĉeeston de tipo.

fonto: opennet.ru

Aldoni komenton