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

Bleni hostin e besueshĂ«m pĂ«r faqet me mbrojtje nga DDoS, VPS VDS servera đŸ”„ Bli hostin e besueshĂ«m pĂ«r faqet me mbrojtje nga DDoS, VPS VDS servera | ProHoster