C++20 standard on heaks kiidetud

C++ keele standardimise ISO komitee heakskiidu rahvusvaheline standard „C++20„. Spetsifikatsioonis esitatud vĂ”imalused, vĂ€lja arvatud ĂŒksikud juhtumid, ainult ajaliselt piiratud ĂŒhekordseid paroole ( on kompilaatorites GCC, Clang ja Microsoft Visual C++. C++20 standardile vastavad raamatukogud on teostatud projekti raames Boost.

JĂ€rgmised kaks kuud kehtiv spetsifikatsioon on dokumentatsiooni avaldamise ettevalmistamise etapis, kus teostatakse Ă”igekirjakontrolli ja trĂŒkivigu. Novembri alguses saadetakse lĂ”plik dokument ISO-le avaldamiseks ametliku nimega ISO/IEC 14882:2020. Samal ajal on komitee juba alustanud tööd jĂ€rgmise standardi C++23 (C++2b) kallal ja lĂ€hiajal toimuvatel virtuaalsetel koosolekutel arutatakse vĂ”imalikke uuendused.

Peamised omadused C++20 (koodinÀiteid):

  • Lisatud on „kontseptsioonid“, mallide laiendamine, mis vĂ”imaldab mÀÀrata malliparameetrite nĂ”uete komplekti, mis kompileerimise ajal piirab argumentide komplekti, mida saab malliparameetritena kasutada. Kontseptsioone saab rakendada loogiliste vastuolude vĂ€ltimiseks andmetĂŒĂŒpide omaduste vahel, mida kasutatakse mallis ja sisendparameetrite andmetĂŒĂŒpide omaduste vahel.

    template<typename T>
    concept EqualityComparable = requires(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Komplekti kuuluvad laiendust moodulid, mida saab kasutada pealkirjafailide asemel. Moodulid pakuvad uut viisi lĂ€htekoodi korraldamiseks, tuginedes komponentide piiride mÀÀratlemisele, ilma et oleks vaja siduda pealkirjafailide kaudu „#include“.
  • Makse __VA_OPT__ adaptiivsete variatiivsete makrode avamiseks sĂ”ltuvalt tokenite olemasolust variatiivses argumendis.
  • Tugiteenuse „“ kolmanda osapoole vĂ”rdlemiseks.
  • Tugi vaikimisi algvÀÀrtustamiseks bitivĂ€li.
  • VĂ”ime lambda-siduda vĂ€ljendeid „*this“.

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

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

  • Elemendi kutsumine liikmesettevĂ”tte kaudu, kasutades vĂ€ljendiga «const &» mÀÀratud ajutiste objektide nĂ€itajaid.
  • Kustutamisteguri operaatormoodul koos hĂ€vitajaga, nagu on kirjeldatud dokumendis. P0722R1.
  • Klassidele on lubatud kasutada tĂŒĂŒpi mitte mÀÀratletud malliparametreid.

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

    template
    auto get_foo() {
    return f;
    }

    get_foo(); // kasutab kaudset konstruktoreid
    get_foo();

  • MĂ€letamatud lambda-vĂ€ljendid konstruktoriga.
  • Mallide sĂŒntaksi kasutamise lubamine lambda-vĂ€ljendites («auto f = [](std::vector v)»).
  • Mugavus stringi literalide kasutamisel malliparametrites.
  • C-stiilis algatamise sĂŒntaksi toimetamine — selgesĂ”naliselt mitte loetletud initsialiseerimise vĂ€li algatatakse vaikimisi.

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

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

  • TĂŒhi andmestruktuuri liikmete toimetamine.
  • Atribuutide likely ja unlikely toimetamine, et teavitada optimeerijat koondumise tĂ”enĂ€osusest ('[[likely]] if (random > 0) {').
  • Vahemike kasutamise mugavus muutuva vÀÀrtuse algatamiseks 'for' tsĂŒklis.

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

  • Massi automaatne arvutamine new („new double[]{1,2,3}“);
  • Atribuut „[[no_unique_address]]“, mille puhul andmeid mitte sisaldavad muutujad ei vĂ”ta ruumi.
  • Aatomilised nĂ€idikud (std::atomic<shared_ptr<T>> ja std::atomic<weak_ptr<T>>).
  • VĂ”imalus kutsuda vĂ€lja virtuaalseid funktsioone tingimuslike vĂ€ljendite sees.
  • Toetatakse kiireid (immediate) funktsioone, mis saavad töötada ainult konstantidega.

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

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

  • VĂ”imalus kasutada constexpr koos virtuaalfunktsioonidega („constexpr virtual int f() const { return 2; }“).
  • Standardraamatukogus:
    • Lisatud support char8_t tĂŒĂŒpi UTF-8 stringide jaoks.
    • Lisatud pĂ€iste failid bit (bitite tegevused) ja version.
    • Tekkinud on vĂ”imalus kontrollida stringide prefikseid ja sufikseid (starts_with, ends_with).
    • Lisatud tĂŒpiseerijad std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible ja std::type_identity.
    • Lisatud funktsioonid std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated ja std::assume_aligned.
    • std::make_shared-s lisatud massiivide toetus.
    • Lisatud funktsioon std::to_array sarnaste objektide muutmiseks std::array-ks.
  • Mugavam sĂŒntaks enumite jaoks:

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

    std::string_view to_string(rgba_color_channel minu_kanal) {
    switch (minu_kanal) {
    using enum rgba_color_channel;
    case punane: return «punane»;
    case roheline: return «roheline»;
    case sinine: return «sinine»;
    case alfa: return «alfa»;
    }
    }

  • Indeksite puhul on use of operation «,» (a[b,c]) keelatud mÀÀramatuse tĂ”ttu. Enamik muutujaid, mis on deklareeritud vĂ”ti sĂ”naga volatile, ei toeta enam operatsioone, sealhulgas on keelatud operatsioonid «++» ja «—» tavaliste tĂŒĂŒpidega.
  • VĂ€hendatud olukordade arvu, kus on vajalik «typename» kasutamine tĂŒĂŒbi olemasolu mĂ€rkimiseks.

Allikas: opennet.ru

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster