C++20 standard on heaks kiidetud.

ISO komitee C++ keele standardimiseks kinnitas rahvusvaheline standard "C++20". Spetsifikatsioonis esitatud vĂ”imalused, vĂ€lja arvatud ĂŒksikud juhud, on toetatud kompilaatorites GCC, Clang ja Microsoft Visual C++. C++20 standardi toetavad raamatukogud on rakendatud projekti Boost.

JĂ€rgmise kahe kuu jooksul kinnitatud spetsifikatsioon valmib dokumentide avaldamiseks, kus viiakse lĂ€bi toimetamisprotsess Ă”igekirja- ja trĂŒkivigade parandamiseks. Novembri alguses saadetakse lĂ”plik dokument ISO-le avaldamiseks formaalse nimega ISO/IEC 14882:2020. Samal ajal on komitee juba asunud tööle jĂ€rgmise standardi C++23 (C++2b) kallal ja lĂ€hitulevikus vaadatakse jĂ€rgmisi uuendused.

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

  • Lisatud on "kontseptsioonid", mallide laiendused, mis vĂ”imaldavad mÀÀrata nĂ”uete kogumi malliparameetritele, mis kompileerimise ajal piiravad argumentide kogumit, mida saab malliparameetritena kasutada. Kontseptsioone saab kasutada, et vĂ€ltida loogilisi vastuolusid andmetĂŒĂŒpide omaduste vahel, mis on kasutusel mallis, ja sissetulevate parameetrite andmetĂŒĂŒpide omaduste vahel.

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

  • NĂ”utud on laiendused moodulite tööks, mida saab kasutada pealkirjafailide asemel. Moodulid pakuvad uut viisi lĂ€htekoodide korraldamiseks, tuginedes komponentide piiride mÀÀratlemisele, ilma "#include" pealkirjafailide juurde sidumata.
  • Maksu __VA_OPT__ adaptiivseks avamiseks variatiivsest makros sĂ”ltuvalt variatiivsete argumentide kohalolekust.
  • Toetust operaatorile "" kolmikvĂ”rdlemiseks.
  • Toetatakse vaikeelementide initsialisaatoreid bitivĂ€ljade jaoks.
  • VĂ”imalus lambda-sidumisel vĂ€ljendite "*this" kasutamiseks.

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

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

  • Elementide kutsumine nĂ€itajate (Pointer-to-member) kaudu, kasutades "const &" kaudu mÀÀratud ajutiste objektide nĂ€itajaid.
  • Destruktoriga delete operaator, nagu on kirjeldatud dokumendis P0722R1.
  • Klassidele on lubatud kasutada ilma tĂŒĂŒbita malliparameetreid.

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

    template
    auto get_foo() {
    return f;
    }

    get_foo(); // kasutab varjatud konstruktorit
    get_foo();

  • Mittekasutatavad lambda-vĂ€ljendid konstruktoriga.
  • Mallide sĂŒntaksi kasutamise lubatavus lambda-vĂ€ljendites («auto f = [<typename T>(std::vector<T> v)»).
  • Stringliteraalide kasutamise vĂ”imalus malliparametrites.
  • C-stiilis initsialiseerimise sĂŒntaksi tugi - nimetamata initsialiseerimisloendis olevad vĂ€ljad initsialiseeritakse 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ĂŒhjade andmestruktuuri liikmete tugi.
  • Tugi atribuutidele likely ja unlikely, et informeerida optimeerijat tingimuslausete tĂ”enĂ€osuse kohta («[[likely]] if (random > 0) {«).
  • Vahemike kasutamise vĂ”imalus muutujate vÀÀrtuste initsialiseerimiseks tsĂŒklis «for»

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

  • Massi suuruse automaatne arvutamine new-is («new double[]{1,2,3}»);
  • Atribuut «[[no_unique_address]]», mille korral andmeid mitte sisaldavad muutujad ei vĂ”ta ruumi.
  • Atomilised nĂ€idikud (std::atomic<shared_ptr<T>> ja std::atomic<weak_ptr<T>>).
  • Virtuaalsete funktsioonide kutsumise vĂ”imalus tingimuslausetes.
  • Kiirete (immediate) funktsioonide tugi, mis vĂ”ivad 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); // ERROR: 'x' ei saa kasutada konstandina

  • constexpr'i rakendamise vĂ”imalus virtuaalsetele funktsioonidele («constexpr virtual int f() const { return 2; }»).
  • Standardraamatukogus:
    • Lisatud tugi char8_t tĂŒĂŒbile UTF-8 stringide jaoks.
    • Lisatud pĂ€isefailid bit (bitilised operatsioonid) ja version.
    • Mugavuse huvides on now vĂ”imalik kontrollida stringide eelist ja suffikse (starts_with, ends_with).
    • Lisatud tĂŒĂŒbihierarhiad 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_sharedis on lisatud toetus massiividele.
    • Lisatud funktsioon std::to_array, et muuta massiivi sarnased objektid std::array-ks.
  • Mugavam sĂŒntaks loetelude jaoks:

    enum class rgba_color_channel { red, green, blue, alpha };

    std::string_view to_string(rgba_color_channel my_channel) {
    switch (my_channel) {
    using enum rgba_color_channel;
    case red: return «red»;
    case green: return «green»;
    case blue: return «blue»;
    case alpha: return «alpha»;
    }
    }

  • Indekstest on keelatud kasutada operatsiooni „,“ („a[b,c]“) mÀÀramatu kĂ€itumise tĂ”ttu. Tugi enamiku volatile mĂ€rksĂ”naga deklareeritud muutuja operatsioonide jaoks on lĂ”petatud, sealhulgas on keelatud operatsioonid „++“ ja „—“ tavaliste tĂŒĂŒpide puhul.
  • VĂ€hendatud on olukordade arvu, kus tuleb kasutada „typename“, et teavitada tĂŒĂŒbi olemasolust.

Allikas: opennet.ru

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster