Kiwango cha C++20 kimeidhinishwa

Kamati ya ISO ya Kusawazisha Lugha ya C++ kupitishwa viwango vya kimataifa"C ++ 20". Uwezo uliowasilishwa katika vipimo, isipokuwa kesi za pekee, mkono katika wakusanyaji GCC, kelele ΠΈ Microsoft Visual C ++. Maktaba za kawaida zinazotumia C++20 zinatekelezwa ndani ya mradi Boost.

Katika miezi miwili ijayo, vipimo vilivyoidhinishwa vitakuwa katika hatua ya kuandaa hati kwa ajili ya kuchapishwa, ambayo kazi itafanyika juu ya marekebisho ya wahariri wa makosa ya spelling na typos. Mapema mwezi wa Novemba, hati itakayotolewa itatumwa kwa ISO ili kuchapishwa chini ya jina rasmi ISO/IEC 14882:2020. Wakati huo huo, kamati tayari imeanza kufanyia kazi kiwango kijacho cha C++23 (C++2b) na itazingatia chaguo zinazowezekana katika mkutano wake wa mtandaoni unaofuata. ubunifu.

kuu makala C ++ 20 (mifano ya kanuni):

  • "Dhana" zilizoongezwa, viendelezi vya kiolezo, ambavyo hukuruhusu kufafanua seti ya mahitaji ya kigezo cha kiolezo, ambayo, kwa wakati wa kukusanya, hupunguza seti ya hoja zinazoweza kukubalika kama vigezo vya kiolezo. Dhana zinaweza kutumika ili kuepuka kutofautiana kimantiki kati ya sifa za aina za data zinazotumiwa ndani ya kiolezo na sifa za aina ya data za vigezo vya ingizo.

    kiolezo
    dhana EqualityComparable = inahitaji(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Imekubaliwa upanuzi kwa kufanya kazi na moduli ambazo zinaweza kutumika badala ya faili za kichwa. Moduli hutoa njia mpya ya kupanga msimbo wa chanzo kulingana na kufafanua mipaka ya vipengele, bila kujumuisha faili za kichwa kupitia "#include".
  • Macro __VA_OPT__ kwa upanuzi wa kubadilika wa macros tofauti kulingana na uwepo wa ishara katika hoja ya kutofautiana.
  • Msaada kwa opereta "" kwa kulinganisha kwa njia tatu.
  • Usaidizi kwa vianzishi msingi vya kipengele kwa sehemu ndogo.
  • Uwezo wa lambda kunasa misemo ya "*hii".

    tengeneza int_value {
    int n = 0;
    auto getter_fn() {
    // MBAYA:
    // rudisha [=]() {rejesha n; };

    // NZURI:
    rudisha [=, *hii]() {rejesha n; };
    }
    };

  • Vipengee vya kupiga simu kwa kielekezi (Kielekezi-kwa-mwanachama), kwa kutumia vielelezo kwa vitu vya muda vilivyofafanuliwa kupitia usemi wa "const &".
  • Opereta wa kufuta na mharibifu aliyeelezwa kwenye hati P0722R1.
  • Madarasa yanaruhusiwa kutumia vigezo vya kiolezo bila aina.

    muundo foo {
    foo() = chaguo-msingi;
    constexpr foo(int) {}
    };

    kiolezo
    auto get_foo() {
    kurudi f;
    }

    get_foo(); // hutumia kijenzi kisicho wazi
    pata_foo ();

  • Semi za lambda zisizodumu na mjenzi.
  • Kuruhusu sintaksia ya kiolezo kwa misemo ya lambda (β€œauto f = [] (std::vekta v)).
  • Uwezo wa kutumia maandishi ya kamba katika vigezo vya kiolezo.
  • Usaidizi wa sintaksia ya uanzishaji wa mtindo wa C - sehemu ambazo hazijaorodheshwa kwa uwazi katika orodha ya uanzishaji huanzishwa kwa chaguomsingi.

    muundo A {
    intx;
    int y;
    int z = 123;
    };

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

  • Usaidizi kwa washiriki wa muundo wa data tupu.
  • Usaidizi wa sifa zinazowezekana na zisizotarajiwa za kufahamisha kiboreshaji kuhusu uwezekano wa muundo wa masharti kuanzishwa (β€œ[[huenda]] ikiwa (nasibu > 0) {β€œ).
  • Uwezo wa kutumia safu kuanzisha maadili tofauti katika kitanzi cha "kwa".

    kwa (auto v = std::vekta{1, 2, 3}; otomatiki& e : v) {

  • Hesabu ya kiotomatiki ya ukubwa wa safu katika mpya (β€œnew double[]{1,2,3}”);
  • Sifa ya β€œ[[no_unique_address]]” ambayo viambajengo bila data havichukui nafasi.
  • Viashiria vya atomiki (std::atomic > na std::atomic >).
  • Uwezo wa kuita vitendaji vya kawaida katika misemo ya masharti.
  • Usaidizi wa utendakazi wa haraka ambao unaweza kufanya kazi tu na viunga.

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

    constexpr int r = sqr(100); // SAWA
    int x = 100;
    int r2 = sqr(x); // HITILAFU: 'x' haiwezi kutumika kama kawaida

  • Uwezekano wa kutumia constexpr iliyo na vitendakazi dhahania (β€œconstexpr virtual int f() const { return 2; }”).
  • Katika maktaba ya kawaida:
    • Usaidizi ulioongezwa kwa aina ya char8_t kwa mifuatano ya UTF-8.
    • Aliongeza faili za kichwa kidogo (shughuli kidogo) na toleo.
    • Sasa inawezekana kuangalia kiambishi awali na kiambishi tamati cha mifuatano (huanza_na, huisha_na).
    • Imeongezwa std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible na std::aina_sifa za utambulisho.
    • Utendaji ulioongezwa std::midpoint, std::lerp, std::bind_front, std::source_location, std::tembelea, std::is_constant_evaluated na std::assume_aligned.
    • Imeongeza usaidizi wa safu kwa std::make_shared.
    • Imeongeza std::to_array kazi ya kubadilisha vitu kama safu kuwa std::array.
  • Syntax rahisi zaidi ya kuhesabu:

    enum class rgba_color_channel { nyekundu, kijani, bluu, alpha };

    std::string_view to_string(rgba_color_channel my_channel) {
    badilisha (chaneli_yangu) {
    kutumia enum rgba_color_channel;
    kesi nyekundu: kurudi "nyekundu";
    kesi ya kijani: kurudi "kijani";
    kesi ya bluu: kurudi "bluu";
    kesi alpha: kurudi "alpha";
    }
    }

  • Katika faharasa, kwa sababu ya tabia isiyojulikana, matumizi ya operesheni "," ("a[b,c]") ni marufuku. Usaidizi kwa shughuli nyingi zilizo na vigeu vilivyotangazwa kwa neno kuu tete umekatishwa, ikijumuisha utendakazi wa "++" na "β€”" na aina za kawaida.
  • Imepunguza idadi ya hali ambazo "typename" inahitajika ili kuonyesha uwepo wa aina.

Chanzo: opennet.ru

Kuongeza maoni