I-C++20 ejwayelekile igunyaziwe

ISO Committee on Standardization of the C++ Language kugunyaziwe izinga lamazwe ngamazwe "I-C ++ 20". Amakhono ethulwe ekucacisweni, ngaphandle kwamacala angawodwa, isekelwe kubahlanganisi I-GCC, klabalasa и IMicrosoft Visual C ++. Imitapo yolwazi ejwayelekile esekela i-C++20 isetshenziswa ngaphakathi kwephrojekthi Boost.

Ezinyangeni ezimbili ezizayo, ukucaciswa okugunyaziwe kuzoba esigabeni sokulungiselela idokhumenti ukuze ishicilelwe, lapho umsebenzi uzokwenziwa khona ekulungiseni ukuhlelwa kwamaphutha esipelingi kanye nama-typos. Ekuqaleni kukaNovemba, idokhumenti ewumphumela izothunyelwa ku-ISO ukuze ishicilelwe ngaphansi kwegama elisemthethweni ISO/IEC 14882:2020. Okwamanje, ikomidi seliwuqalile kakade umsebenzi ezingeni elilandelayo elingu-C++23 (C++2b) futhi lizocubungula izinketho ezingase zibe khona emhlanganweni walo olandelayo olandelayo. emisha.

main izici I-C ++ 20 (izibonelo zamakhodi):

  • Kwengezwe "imibono", izandiso zesifanekiso, ezikuvumela ukuthi uchaze isethi yezidingo zepharamitha yesifanekiso, okuthi ngesikhathi sokuhlanganisa, sikhawulele isethi yezimpikiswano ezingamukelwa njengemingcele yesifanekiso. Imiqondo ingasetshenziswa ukugwema ukungqubuzana okunengqondo phakathi kwezakhiwo zezinhlobo zedatha ezisetshenziswa ngaphakathi kwesifanekiso kanye nezakhiwo zohlobo lwedatha zamapharamitha okokufaka.

    isifanekiso
    umqondo we-EqualityComparable = udinga(T a, T b) {
    {a == b } -> std::boolean;
    {a != b } -> std::boolean;
    };

  • Kwamukelwe ukukhuliswa ukusebenza ngamamojula angasetshenziswa esikhundleni samafayela anhlokweni. Amamojula ahlinzeka ngendlela entsha yokuhlela ikhodi yomthombo ngokusekelwe ekuchazeni imingcele yezingxenye, ngaphandle kokufaka amafayela anhlokweni ngokuthi “#include”.
  • Imakhro __VA_OPT__ yokwandiswa okuguquguqukayo kwamamakhro aguquguqukayo kuye ngokuba khona kwamathokheni kumpikiswano eguquguqukayo.
  • Usekelo lwe-opharetha "" lokuqhathanisa ngezindlela ezintathu.
  • Usekelo lweziqalisi zezinto ezizenzakalelayo zama-bitfields.
  • Ikhono lokuthwebula i-lambda ethi "*le" izinkulumo.

    yakha int_value {
    int n = 0;
    i-auto getter_fn() {
    //KUBI:
    // buyisela [=]() {buyisela n; };

    // OKUHLE:
    buyisela [=, *le]() {buyisela n; };
    }
    };

  • Izakhi zokushaya ngesikhombi (Isikhombi-kuya-kwilungu), kusetshenziswa izikhombi zezinto zesikhashana ezichazwe ngenkulumo ethi “const &”.
  • I-opharetha esusayo enombhubhisi ochazwe kudokhumenti I-P0722R1.
  • Amakilasi avunyelwe ukusebenzisa amapharamitha esifanekiso ngaphandle kohlobo.

    hlela i-foo {
    foo() = okuzenzakalelayo;
    constexpr foo(int) {}
    };

    isifanekiso
    auto get_foo() {
    buyisela f;
    }

    get_foo(); // isebenzisa umakhi ongacacile
    thola_foo ();

  • Izinkulumo ze-lambda ezingaphezi ezinomakhi.
  • Ivumela i-syntax yesifanekiso yezinkulumo ze-lambda (“auto f = [] (std::vector v)).
  • Ikhono lokusebenzisa iyunithi yezinhlamvu ezingokoqobo kumapharamitha wesifanekiso.
  • Usekelo lwe-syntax yokuqalisa yesitayela se-C - izinkambu ezingafakwanga ngokucacile ohlwini lokuqalisa ziqalwa ngokuzenzakalelayo.

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

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

  • Ukusekelwa kwamalungu esakhiwo sedatha engenalutho.
  • Usekelo lwezibaluli ezingaba khona nezingenzeki zokwazisa isithuthukisi mayelana namathuba okuthi ukwakhiwa okunemibandela kuqaliswe (“[[cishe]] uma (okungahleliwe > 0) {“).
  • Ikhono lokusebenzisa ububanzi ukuze kuqaliswe amanani aguquguqukayo kuluphu ethi "for".

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

  • Ukubala okuzenzakalelayo kosayizi wamalungu afanayo okusha (“okuphindwe kabili[]{1,2,3}”);
  • “[[no_unique_address]]” isibaluli lapho okuguquguqukayo ngaphandle kwedatha kungathathi isikhala.
  • Izinkomba ze-athomu (std::atomic > kanye ne-std::atomic >).
  • Ikhono lokubiza imisebenzi ebonakalayo ngezinkulumo ezinemibandela.
  • Ukusekela imisebenzi esheshayo engasebenza kuphela ngama-constants.

    Consteval int sqr(int n) {
    buyisela n * n;
    }

    constexpr int r = sqr(100); // KULUNGILE
    int x = 100;
    int r2 = sqr(x); // IPHUTHA: 'x' ayikwazi ukusetshenziswa njengokungashintshi

  • Amathuba okusebenzisa i-constexpr ngemisebenzi ebonakalayo (“constexpr virtual int f() const { return 2; }”).
  • Kulabhulali ejwayelekile:
    • Usekelo olungeziwe lohlobo lwe-char8_t lwezintambo ze-UTF-8.
    • Kwengezwe unhlokweni bit (bit operations) kanye nenguqulo.
    • Manje sekungenzeka ukuhlola isiqalo nesijobelelo seyunithi yezinhlamvu (iqala_nge, iphetha_nga).
    • Kwengezwe i-std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible kanye ne-std::type_identity.
    • Imisebenzi eyengeziwe std::midpoint, std::lerp, std::bind_front, std::source_location, std::vakashela, std::is_constant_evaluated futhi std::assume_aligned.
    • Kwengezwe ukusekelwa kwamalungu afanayo ku-std::make_shared.
    • Kwengezwe umsebenzi we-std::to_array ukuze kuguqulelwe izinto ezifana ne-std::array.
  • I-syntax yokubala elula kakhulu:

    enum class rgba_color_channel {obomvu, oluhlaza okotshani, oluhlaza okwesibhakabhaka, alpha };

    std::string_view to_string(rgba_color_channel my_channel) {
    shintsha (isiteshi_ sami) {
    usebenzisa i-enum rgba_color_channel;
    icala elibomvu: buyisela "obomvu";
    icala eliluhlaza: buyisela "luhlaza";
    icala blue: buyisela "blue";
    icala alpha: buyisela "alpha";
    }
    }

  • Ezinkombeni, ngenxa yokuziphatha okungacacisiwe, ukusetshenziswa komsebenzi othi “,” (“a[b,c]”) akuvunyelwe. Ukusekelwa kwemisebenzi eminingi enezinto eziguquguqukayo ezimenyezelwe ngegama elingukhiye eliguquguqukayo kuye kwanqanyulwa, okuhlanganisa imisebenzi ethi “++” kanye “—” enezinhlobo ezijwayelekile.
  • Kwehliswe inani lezimo lapho "i-typename" idingeka khona ukuze kuboniswe ubukhona bohlobo.

Source: opennet.ru

Engeza amazwana