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

ISO C++ լեզվի ստանդարտացման հանձնաժողով հաստատված միջազգային ստանդարտ»C ++ 20«. Հստակեցման մեջ ներկայացված հնարավորությունները, բացառությամբ առանձին դեպքերի, աջակցել է կոմպիլյատորներում GCC, Ngնգոց и Microsoft Visual C ++. Ծրագրի շրջանակներում ներդրված են ստանդարտ գրադարաններ, որոնք աջակցում են C++20-ին Բարձրացնել.

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

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

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

    կաղապար
    հասկացություն EqualityComparable = պահանջում է (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() {
    //ՎԱՏ:
    // վերադարձ [=]() { return n; };

    // ԼԱՎ:
    return [=, *this]() { return n; };
    }
    };

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

    struct foo {
    foo () = լռելյայն;
    constexpr foo(int) {}
    };

    կաղապար
    auto get_foo() {
    վերադարձ f;
    }

    get_foo (); // օգտագործում է անուղղակի կոնստրուկտոր
    get_foo ();

  • Ոչ համառ լամբդա արտահայտություններ կոնստրուկտորով:
  • Թույլատրել կաղապարի շարահյուսությունը լամբդա արտահայտությունների համար («auto f = [] (ստդ::վեկտոր v)»):
  • Կաղապարի պարամետրերում լարային բառապաշար օգտագործելու ունակություն:
  • Աջակցություն C ոճի սկզբնավորման շարահյուսությանը. սկզբնավորման ցուցակում հստակորեն չնշված դաշտերը սկզբնավորվում են լռելյայն:

    կառուցվածք A {
    intx;
    int y;
    int z = 123;
    };

    A a {.x = 1, .z = 2}; // կացին == 1, այ == 0, ազ == 2

  • Աջակցություն դատարկ տվյալների կառուցվածքի անդամներին:
  • Աջակցություն հավանական և անհավանական ատրիբուտներին՝ օպտիմիզատորին տեղեկացնելու պայմանական կառուցվածքի գործարկման հավանականության մասին («[[հավանական]], եթե (պատահական > 0) {»):
  • «for» հանգույցում փոփոխական արժեքները սկզբնավորելու համար միջակայքեր օգտագործելու ունակություն

    համար (auto v = std::vector{1, 2, 3}; auto& e : v) {

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

    consteval int sqr(int n) {
    վերադարձ n * n;
    }

    constexpr int r = sqr (100); // ԼԱՎ
    int x = 100;
    int r2 = sqr (x); // ՍԽԱԼ. «x»-ը չի կարող օգտագործվել որպես հաստատուն

  • Constexpr-ի վիրտուալ ֆունկցիաների հետ օգտագործելու հնարավորությունը (“constexpr virtual int f() const { return 2; }”):
  • Ստանդարտ գրադարանում.
    • Ավելացվեց աջակցություն char8_t տեսակի համար UTF-8 տողերի համար:
    • Ավելացվեց վերնագրի ֆայլերի բիթ (բիթային գործողություններ) և տարբերակը:
    • Այժմ հնարավոր է ստուգել տողերի նախածանցը և վերջածանցը (սկսվում_ով, ավարտվում_ով):
    • Ավելացվել են 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 ֆունկցիան՝ զանգվածի նմանվող օբյեկտները std::array-ի փոխարկելու համար:
  • Ավելի հարմար թվային շարահյուսություն.

    enum class rgba_color_channel {կարմիր, կանաչ, կապույտ, ալֆա };

    std::string_view to_string(rgba_color_channel my_channel) {
    անջատիչ (my_channel) {
    օգտագործելով enum rgba_color_channel;
    գործը կարմիր. վերադարձ «կարմիր»;
    գործը կանաչ. վերադարձ «կանաչ»;
    գործը կապույտ. վերադարձ «կապույտ»;
    գործի ալֆա. վերադարձ «ալֆա»;
    }
    }

  • Ինդեքսներում, չսահմանված վարքագծի պատճառով, արգելվում է «,» («a[b,c]») գործողության օգտագործումը: Անկայուն հիմնաբառով հայտարարագրված փոփոխականներով գործողությունների մեծ մասի աջակցությունը դադարեցվել է, ներառյալ ստանդարտ տեսակներով «++» և «—» գործառնությունները:
  • Նվազեցրեց իրավիճակների քանակը, որոնցում «տիպի անունը» պահանջվում է տիպի առկայությունը նշելու համար:

Source: opennet.ru

Добавить комментарий