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