Հաստատվել է C++20 ստանդարտը

ISO կոմիտեն C++ լեզվի ստանդարտացման համար հաստատել միջազգային ստանդարտ «C++20«. Մեկնաբանված չափորոշիչի հնարավորությունները, բացի մի քանի դեպքերից, աջակցված են կոմպիլատորներում GCC, Clang և Microsoft Visual C++. C++20 ստանդարտ գրադարանները իրականացված են Boost.

Ըստ հաստատված չափորոշիչի, հաջորդ երկու ամիսների ընթացքում փաստաթուղթը կպաշտպանի հրապարակման պատրաստման փուլում, որի ընթացքում կկատարվի ուղղագրական և տպագրական սխալների խմբագրություն: Նոյեմբերի սկզբին արդյունքային փաստաթուղթը կուղարկվի ISO՝ պաշտոնական անվանմամբ ISO/IEC 14882:2020: Մինչ այդ, կոմիտեն արդեն սկսել է աշխատել C++23 (C++2b) հաջորդ ստանդարտի վրա և մոտակայում վիրտուալ նիստում կքննարկվի հնարավոր նորություններ.

Հիմնական հատկություններ C++20 (կոդի օրինակներ):

  • Ավելացված են «հասկացություն» հասկացությունները, որոնք ընդլայնում են ձևանմուշները և թույլ են տալիս սահմանել պահանջների հավաքածու ձևանմուշի պարամետրերին, որոնք ժամանակին սահմանափակում են դրանց փոխանցված արգումենտների հավաքածուն: Հասկացություններն օգտագործվում են մտաել մեր տեղեկություններում օգտագործվող տվյալների տեսակների հատկությունների միջև հարցադրումների խուսափելու համար:

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

  • ընդգրկված են երկրաչափությունները մոդուլների հետ աշխատելու համար, որոնք կարող են օգտագործվել տեղադրանքների սովորական ֆայլերի փոխարեն: Մոդուլներն ապահովում են նոր եղանակի աղբյուրային տեքստերի կազմակերպման վրա, հիմնված բաղադրիչների սահմանների սահմանման վրա առանց «#include» ֆայլերի:
  • __VA_OPT__ մակրո տարբերակիչների հարմարեցման համար:
  • Երրորդ կողմի համեմատության օպերատորի փոխ աջակցություն:
  • Զարգացման սկզբնաղբյուրների տարրերի առարկաների աջակցություն:
  • Լամբդա-խաղաղացման «*this» արտահայտություններ:

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

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

  • Թղթերի միջոցով ցուցադրողների որոնում (Pointer-to-member), օգտագործելով «const &» արտահայտությունների միջոցով սահմանված մատչելիության ցուցադրողներին:
  • Delete օպերատոր, որը դեստրուկտոր ունի, ըստ P0722R1.
  • Դասերին թույլատրվում է առանց տիպի պարամետրերի օգտագործում:

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

    template
    auto get_foo() {
    return f;
    }

    get_foo(); // օգտագործում է թաքնված կոնստրուկտորը
    get_foo();

  • Չպահվող լամբդա-իմաստներ կոնստրուկտորով:
  • Լամբդա-իմաստինների սինտաքսում օգտագործման հնարավորությունը՝ (auto f = [](std::vector v)):
  • Ստրինգի բառն աճել լամբդա-իմաստների պարամետրերում:
  • Աջակցություն C-ամսաթերթի սինտաքսին՝ ակներևորեն դեռևս չաստղավորված ձևով արտահայտությունները, նախանշվում են նախօրոք:

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

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

  • Աջակցություն դատարկ տվյալների անդամներին:
  • likely և unlikely ատրիբուտների աջակցություն, օրինակ, условная конструкция («[[likely]] if (random > 0) {«).
  • for ցիկլում փոփոխականների արժեքների ևнициализацияի համար диапазոնների օգտագործման հնարավորությունը

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

  • array-ի չափի ավտոմատ հաշվարկում new («new double[]{1,2,3}»);
  • «[[no_unique_address]]» ատրիբուտ, որի դեպքում առանց տվյալների փոփոխականները չվերադարձնում են տարածք:
  • Ատոմար ցուցակներ (std::atomic<shared_ptr> և std::atomic<weak_ptr>).
  • Վիրտուալ ֆունկցիաների կանչելու հնարավորություն պայմանական արտահայտություններում:
  • Արագ (immediate) ֆունկցիաների աջակցություն, որոնք աշխատանքն իրականացրու միայն կոնստանտների հետ:

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

    constexpr int r = sqr(100); // OK
    int x = 100;
    int r2 = sqr(x); // ERROR: ‘x’ չի կարող օգտագործվել որպես կոնստանտ

  • constexpr կիրառման հնարավորություն վիրտուալ ֆունկցիաների հետ («constexpr virtual int f() const { return 2; }»).
  • Ստանդարտ գրադարանը:
    • Ավելացվել է char8_t տիպի աջակցությունը UTF-8 շարքերի համար.
    • Ավելացվել են bit (բիթային գործողություններ) և version գրապահոցները.
    • Ստացվել է ստուգելու հնարավորությունը տողերի նախնական և վերջնական ափսեների համար (starts_with, ends_with).
    • Ավելացվել են std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible և std::type_identity տիպերը.
    • Ավելացվել են std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated և std::assume_aligned ֆունկցիաները.
    • std::make_shared-ում ավելացել է массива աջակցության.
    • Ավելացվել է std::to_array ֆունկցիան, որը նմանեցնում է массива objects-ը std::array-ին.
  • Լիարժեք ավելի հարմար enumerations սինտակս:

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

  • Ինդեքսներում անորոշ վարքի պատճառով արգելվում է «,» գործողության օգտագործումը («a[b,c]»). արգելվել են volatile ստանդարտ տիպերով հայտարարված փոփոխականներով մեծամիտների մեջ շատ операций:
  • Կրճատվել է այն իրավիճակների թիվը, որոնց անհրաժեշտ է նշել «typename» իսկ տիպի առկայությունը տեղեկացնելու համար.

Ընտանիք: opennet.ru

Գնել հուսալի հյուրընկալում DDoS պաշտպանությամբ, VPS VDS սերվերներով 🔥 Գնել հուսալի հյուրընկալում DDoS պաշտպանությամբ, VPS VDS սերվերներով | ProHoster