C++20 စံနှုန်းကို အတည်ပြုခဲ့သည်။

C++ ဘာသာစကား၏ စံသတ်မှတ်ခြင်းဆိုင်ရာ ISO ကော်မတီ အတည်ပြုခဲ့သည်။ နိုင်ငံတကာအဆင့်မီ"C ++ 20” . သီးခြားအခြေအနေများမှ လွဲ၍ သတ်မှတ်ချက်တွင် ဖော်ပြထားသည့် စွမ်းဆောင်ရည်များ၊ ထောက်ခံသည် compilers များတွင် GCC, ခုတ်ထစ်ခြင်း။ и Microsoft က Visual C ++. ပရောဂျက်အတွင်း C++20 ကို ပံ့ပိုးပေးသည့် စံစာကြည့်တိုက်များကို အကောင်အထည်ဖော်သည်။ တိုးတက်မှု.

လာမည့်နှစ်လတွင် အတည်ပြုထားသော သတ်မှတ်ချက်သည် ထုတ်ဝေရန်အတွက် စာရွက်စာတမ်းပြင်ဆင်သည့်အဆင့်တွင်ဖြစ်ပြီး စာလုံးပေါင်းအမှားအယွင်းများနှင့် typos များကို အယ်ဒီတာအဖွဲ့မှ ပြင်ဆင်ခြင်းလုပ်ငန်းကို ဆောင်ရွက်မည်ဖြစ်သည်။ နိုဝင်ဘာလအစောပိုင်းတွင်၊ ရရှိလာသောစာရွက်စာတမ်းအား တရားဝင်အမည် ISO/IEC 14882:2020 အောက်တွင်ထုတ်ဝေရန်အတွက် ISO သို့ပေးပို့မည်ဖြစ်ပါသည်။ ထိုအတောအတွင်း၊ ကော်မတီသည် လာမည့် C++23 စံနှုန်း (C++2b) တွင် စတင်လုပ်ဆောင်နေပြီဖြစ်ပြီး ၎င်း၏နောက်လာမည့် virtual အစည်းအဝေးတွင် ဖြစ်နိုင်သည့်ရွေးချယ်စရာများကို ထည့်သွင်းစဉ်းစားမည်ဖြစ်သည်။ တီထွင်ဆန်းသစ်မှုများ.

အဓိက အင်္ဂါရပ်များ C ++ 20 (ကုဒ်ဥပမာများ):

  • ထည့်သွင်းထားသော "အယူအဆများ"၊ ပုံစံပလိတ် ကန့်သတ်ဘောင်များ သတ်မှတ်ချက်များ အစုံအလင်ကို သတ်မှတ်ရန် ခွင့်ပြုသည့် တန်းပလိတ် တိုးချဲ့မှုများ၊ စုစည်းမှုအချိန်၌၊ ပုံစံပလိတ်ပါရာမီတာများအဖြစ် လက်ခံနိုင်သည့် အကြောင်းပြချက်အစုံကို ကန့်သတ်ထားသည်။ နမူနာပုံစံအတွင်းအသုံးပြုသည့် ဒေတာအမျိုးအစားများ၏ ဂုဏ်သတ္တိများနှင့် ထည့်သွင်းကန့်သတ်ဘောင်များ၏ ဒေတာအမျိုးအစားဂုဏ်သတ္တိများအကြား ယုတ္တိမညီသော သဘောတရားများကို ရှောင်ရှားရန် သဘောတရားများကို အသုံးပြုနိုင်သည်။

    ပုံစံခွက်
    EqualityComparable = လိုအပ်သည်(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } --> std::boolean;
    };

  • လက်ခံတယ်။ တိုးချဲ့ header files များအစား အသုံးပြုနိုင်သော module များနှင့် လုပ်ဆောင်ရန်အတွက်။ Modules များသည် “#include” မှတစ်ဆင့် ခေါင်းစီးဖိုင်များ မပါဝင်ဘဲ အစိတ်အပိုင်းများ၏ နယ်နိမိတ်များကို သတ်မှတ်ခြင်းအပေါ် အခြေခံ၍ အရင်းအမြစ်ကုဒ်ကို စုစည်းရန် နည်းလမ်းသစ်တစ်ခု ပေးပါသည်။
  • ပြောင်းလဲနိုင်သော အငြင်းအခုံတွင် တိုကင်များရှိနေခြင်းအပေါ် မူတည်၍ ပြောင်းလဲနိုင်သော မက်ခရိုများအလိုက် လိုက်လျောညီထွေဖြစ်အောင် ချဲ့ထွင်ရန်အတွက် Macro __VA_OPT__။
  • သုံးလမ်း နှိုင်းယှဉ်မှုအတွက် "" အော်ပရေတာအတွက် ပံ့ပိုးမှု။
  • bitfields အတွက် ပုံသေဒြပ်စင် ကနဦးအသုံးပြုမှုများအတွက် ပံ့ပိုးမှု။
  • lambda သည် "* this" အသုံးအနှုန်းများကို ဖမ်းယူနိုင်စွမ်း။

    struct int_value {
    int n = 0;
    အလိုအလျောက် getter_fn() {
    // ဆိုးသည်
    // return [=]() { return n; };

    //ကောင်း:
    return [=, *this]() { return n; };
    }
    };

  • "const &" expression မှတဆင့် သတ်မှတ်ထားသော ယာယီအရာဝတ္ထုများသို့ pointer (Pointer-to-member) ဖြင့် ဒြပ်စင်များကို ခေါ်ဆိုခြင်း။
  • စာရွက်စာတမ်းတွင်ဖော်ပြထားသော destructor ပါသောအော်ပရေတာကိုဖျက်ပါ။ P0722R1.
  • အတန်းများသည် အမျိုးအစားမပါဘဲ နမူနာဘောင်များကို အသုံးပြုခွင့်ရှိသည်။

    struct foo {
    foo() = မူရင်း;
    constexpr foo(int) {}
    };

    ပုံစံခွက်
    အလိုအလျောက် get_foo() {
    ပြန်လာ f;
    }

    get_foo(); // implicit constructor ကိုအသုံးပြုသည်။
    get_foo ( );

  • constructor ဖြင့် မတည်မြဲသော lambda အသုံးအနှုန်းများ။
  • lambda စကားရပ်များအတွက် နမူနာပုံစံ အထားအသိုကို ခွင့်ပြုခြင်း (“အလိုအလျောက် f = [] (std::vector v)")။
  • နမူနာဘောင်ဘောင်များတွင် string literals ကိုသုံးနိုင်သည်။
  • C-စတိုင် ကနဦးသတ်မှတ်ခြင်းဆိုင်ရာ အထားအသိုအတွက် ပံ့ပိုးမှု - ကနဦးသတ်မှတ်ခြင်းစာရင်းတွင် အတိအလင်းဖော်ပြထားခြင်းမရှိသော အကွက်များကို ပုံသေအားဖြင့် အစပြုပါသည်။

    တည်ဆောက်ပုံ A {
    intx;
    int y;
    int z = 123;
    };

    A a { .x = 1, .z = 2 }; // ax == 1, ay == 0, az == 2

  • ဗလာဒေတာဖွဲ့စည်းပုံအဖွဲ့ဝင်များအတွက်ပံ့ပိုးမှု။
  • ဖြစ်နိုင်ခြေရှိသော နှင့် ဖြစ်နိုင်ချေရှိသော ရည်ညွှန်းချက်များအတွက် ပံ့ပိုးကူညီသူအား အခြေအနေအရ တည်ဆောက်ခြင်း၏ ဖြစ်နိုင်ခြေအကြောင်း (“[[ဖြစ်နိုင်ဖွယ်]] if (random > 0) {“)။
  • "for" ကွင်းဆက်တွင် ပြောင်းလဲနိုင်သော တန်ဖိုးများကို စတင်ရန် အပိုင်းအခြားများကို အသုံးပြုနိုင်သည်။

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

  • အသစ်တွင် array အရွယ်အစားကို အလိုအလျောက် တွက်ချက်ခြင်း (“new double[]{1,2,3}”);
  • ဒေတာမရှိသော ကိန်းရှင်များသည် နေရာလွတ်မယူသည့် "[[no_unique_address]]" ရည်ညွှန်းချက်။
  • အနုမြူညွှန်ပြချက်များ (std::atomic > နှင့် std::အနုမြူဗုံး >)။
  • အခြေအနေအရဖော်ပြချက်များတွင် virtual လုပ်ဆောင်ချက်များကိုခေါ်ဆိုနိုင်မှု။
  • ကိန်းသေများနှင့်သာ အလုပ်လုပ်နိုင်သော လက်ငင်းလုပ်ဆောင်ချက်များအတွက် ပံ့ပိုးမှု။

    consteval int sqr(int n) {
    ပြန်လာ n * n;
    }

    constexpr int r = sqr(100); // အိုကေ
    int x = 100;
    int r2 = sqr(x); // ERROR: 'x' ကို ကိန်းသေအဖြစ် အသုံးမပြုနိုင်ပါ။

  • အတုအယောင်လုပ်ဆောင်ချက်များဖြင့် constexpr ကိုအသုံးပြုရန်ဖြစ်နိုင်ခြေ (“constexpr virtual int f() const { return 2; }”)။
  • စံပြစာကြည့်တိုက်တွင်-
    • UTF-8 စာကြောင်းများအတွက် char8_t အမျိုးအစားအတွက် ပံ့ပိုးမှု ထပ်ထည့်ထားသည်။
    • ခေါင်းစီးဖိုင်များကို ဘစ် (bit operations) နှင့် ဗားရှင်းတို့ကို ထည့်သွင်းထားသည်။
    • ယခု ၎င်းသည် စာကြောင်းများ၏ ရှေ့ဆက်နှင့် နောက်ဆက်တွဲ (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 သို့ array များအတွက် ပံ့ပိုးမှု ပေါင်းထည့်ထားသည်။
    • array-like objects များကို std::array သို့ပြောင်းရန် std::to_array လုပ်ဆောင်ချက်ကို ထည့်သွင်းထားသည်။
  • ပိုမိုအဆင်ပြေသော စာရင်းကောက်ခြင်းဆိုင်ရာ syntax-

    enum အတန်းအစား rgba_color_channel { အနီ၊ အစိမ်း၊ အပြာ၊ အယ်လ်ဖာ };

    std::string_view to_string(rgba_color_channel my_channel) {
    ပြောင်းရန် (my_channel) {
    enum rgba_color_channel ကို အသုံးပြု၍
    အနီရောင်- "အနီရောင်" ပြန်လာ;
    case green: return "green";
    အပြာရောင်- "အပြာ" ပြန်လာ;
    case alpha- "alpha" ကို ပြန်ပေးသည်။
    }
    }

  • အညွှန်းများတွင်၊ သတ်မှတ်မထားသော အပြုအမူကြောင့် “,” (“a[b,c]”) ကို အသုံးပြုခြင်းကို တားမြစ်ထားသည်။ မတည်ငြိမ်သောသော့ချက်စကားလုံးဖြင့်ကြေငြာထားသော variable များဖြင့်လုပ်ဆောင်မှုအများစုအတွက်ပံ့ပိုးမှုအား "++" နှင့် "—" စံအမျိုးအစားများဖြင့်လုပ်ဆောင်မှုများအပါအဝင်၊ ရပ်ဆိုင်းလိုက်ပါပြီ။
  • အမျိုးအစားတစ်ခု၏ပါဝင်မှုကိုညွှန်ပြရန် "typename" လိုအပ်သည့်အခြေအနေများအရေအတွက်ကိုလျှော့ချပါ။

source: opennet.ru

မှတ်ချက် Add