Standardi C++20 është miratuar

Komiteti ISO për standardizimin e gjuhës C++ miratoi standardin ndërkombëtar "C++20". Mundësitë e paraqitura në specifikim, me përjashtim të rasteve të vetme, mbështeten në kompilatorët GCC, Clang dhe Microsoft Visual C++. Bibliotekat standarde që mbështesin C++20 janë realizuar në kuadër të projektit Boost.

Në dy muajt e ardhshëm, specifikimi i miratuar do të jetë në fazën e përgatitjes së dokumentit për botim, ku do të punohet në redaktimin e gabimeve ortografike dhe shtypore. Në fillim të nëntorit, versioni rezultat i dokumentit do të dërgohet në ISO për publikim me emrin formal ISO/IEC 14882:2020. Ndërkohë, komiteti ka filluar tashmë punën për standardin e ardhshëm C++23 (C++2b) dhe në takimin e tij virtual të afërt do të shqyrtojë possible innovations.

Main e veçanta C++20 (shembuj kodi):

  • Janë shtuar "konceptet", zgjerimi i shabllonëve që lejon përcaktimin e një seti kërkesash për parametrat e shabllonëve, të cilat gjatë kompollimit kufizojnë grupin e argumenteve që mund të pranohen si parametra shablloni. Konceptet mund të aplikohen për të shmangur pasgjegjësi logjike midis pronave të llojeve të dhënash që përdoren brenda shabllonit dhe pronave të llojeve të dhënash të parametrave të hyrjes.

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

  • Në përbërje përfshihet zgjerimet për të punuar me modulet, të cilat mund të përdoren si zëvendësues për skedarët e titujve. Modulet ofrojnë një mënyrë të re për organizimin e teksteve burimore mbi bazën e përcaktimit të kufijve të komponentëve, pa skedarët e titujve që lidhen përmes "#include".
  • Makro __VA_OPT__ për zbulimin e adaptiv të makrove variative në varësi të pranisë së tokenëve në argumentin variativ.
  • Mbështetje për operatorin "" për krahasimin e treanshëm.
  • Mbështetje për inicializatorët e elementeve me vlera të paracaktuara për fushat e bitëve.
  • Mundësia e kapjes së shprehjeve "*this" në lambda.

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

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

  • Thirrja e elementeve përmes treguesit (Pointer-to-member), duke përdorur tregues të përcaktuar përmes shprehjes "const &" për objekte përkohshme.
  • Operatori delete me destruktues, i përshkruar në dokumentin P0722R1.
  • Klasat janë lejuar të përdorin parametra shablloni pa lloj.

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

    template
    auto get_foo() {
    return f;
    }

    get_foo(); // përdor konstruktorin implicit
    get_foo();

  • Shprehje lambda të papërfillshme me constructor.
  • Lejueshmëria e përdorimit të sintaksës së shablloneve për shprehjet lambda («auto f = [](std::vector v)»).
  • Mundësia e përdorimit të literalëve të vargjeve në parametrat e shabllonit.
  • Mbështetje për sintaksën e inicializimit në stilin C — fusha të pa përmendura në listën e inicializimit inicializohen me vlera me default.

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

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

  • Mbështetje për anëtarët e zbrazët të strukturave të dhënash.
  • Mbështetje për atributet likely dhe unlikely për të informuar optimizuesin për probabilitetin e përsëritjes së një ndarje të kushtëzuar («[[likely]] if (random > 0) {«).
  • Mundësia e përdorimit të intervaleve për inicializimin e vlerave të variablit në ciklin «for»

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

  • Kalkulimi automatik i madhësisë së array në new («new double[]{1,2,3}»);
  • Atributi «[[no_unique_address]]» ku variablat pa të dhëna nuk zënë hapësirë.
  • Pointerat atomikë (std::atomic<shared_ptr> dhe std::atomic<weak_ptr>).
  • Mundësia e thirrjes së funksioneve virtuale në shprehjet kushtetuese.
  • Mbështetje për funksione të shpejta (immediate), të cilat mund të punojnë vetëm me konstante.

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

    constexpr int r = sqr(100); // OK
    int x = 100;
    int r2 = sqr(x); // ERROR: ‘x’ nuk mund të përdoret si konstante

  • Mundësia e aplikimit të constexpr me funksione virtuale («constexpr virtual int f() const { return 2; }»).
  • Në bibliotekën standarde:
    • Shtuar mbështetje për tipin char8_t për vargjet UTF-8.
    • Shtuar skedarët e kokës bit (operacionet mbi bitë) dhe version.
    • Kjo mundëson kontrollin e prefikseve dhe sufikseve të vargjeve (starts_with, ends_with).
    • Shtuar tipazhe std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible dhe std::type_identity.
    • Shtuar funksionet std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated dhe std::assume_aligned.
    • Në std::make_shared është shtuar mbështetje për array.
    • Shtuar funksioni std::to_array për të konvertuar objekte të ngjashme me array në std::array.
  • Sintaksë më e përshtatshme për enumerat:

    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»;
    }
    }

  • Në indekset e ndaluar për shkak të sjelljes së paqartë përdorimi i operacionit «,» («a[b,c]»). Është ndërprerë mbështetje për shumicën e operacioneve me variablat e shpallur me fjalën kyçe volatile, përfshirë ndalimin e operacioneve «++» dhe «—» me llojet standarde.
  • Numri i situatave ku nevojitet tregimi i «typename» për të informuar për praninë e një tipi është reduktuar.

Burimi: opennet.ru

Blini hostim të besueshëm për faqe interneti me mbrojtje DDoS, serverë VPS VDS 🔥 Blini hostim të besueshëm për faqe interneti me mbrojtje DDoS, serverë VPS VDS - ProHoster