Ua ʻae ʻia ka maʻamau C++20

Kōmike ISO no ka hoʻoponopono ʻana i ka ʻōlelo C++ aponoia kūlana honua"C ++ 20". ʻO nā mea hiki i hōʻike ʻia ma ka kikoʻī, koe naʻe nā hihia kaʻawale, kākoʻo ʻia i nā mea hōʻuluʻulu GCC, kani и ʻO Microsoft Visual C ++. Hoʻokomo ʻia nā hale waihona puke maʻamau e kākoʻo ana iā C++20 i loko o ka papahana Boost.

I nā mahina ʻelua e hiki mai ana, aia ka ʻōlelo kikoʻī i ʻāpono ʻia ma ke kahua o ka hoʻomākaukau ʻana i ka palapala no ka paʻi ʻana, kahi e hoʻokō ʻia ai ka hana ma ka hoʻoponopono hoʻoponopono ʻana i nā kuhi hewa a me nā typos. I ka hoʻomaka ʻana o Nowemapa, e hoʻouna ʻia ka palapala hopena i ISO no ka paʻi ʻana ma lalo o ka inoa inoa ISO/IEC 14882:2020. I kēia manawa, ua hoʻomaka ke kōmike i ka hana ma ka C++ 23 maʻamau (C++ 2b) a e noʻonoʻo i nā koho hiki i kāna hālāwai virtual e hiki mai ana. nā mea hou.

ka papa kuhikuhiE hiʻona C ++ 20 (code examples):

  • Hoʻohui ʻia nā "manaʻo", nā hoʻonui template, e ʻae iā ʻoe e wehewehe i kahi hoʻonohonoho o nā koi hoʻohālikelike template, i ka manawa hōʻuluʻulu, e kaupalena i ka hoʻonohonoho o nā manaʻo i hiki ke ʻae ʻia e like me nā ʻāpana template. Hiki ke hoʻohana ʻia nā manaʻo no ka pale ʻana i nā ʻano like ʻole ma waena o nā waiwai o nā ʻano ʻikepili i hoʻohana ʻia i loko o ka template a me nā waiwai ʻano ʻikepili o nā ʻāpana hoʻokomo.

    template
    manaʻo EqualityComparable = pono(T a, T b) {
    {a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Ua ʻae ʻia hoʻopau no ka hana ʻana me nā modules hiki ke hoʻohana ʻia ma kahi o nā faila poʻomanaʻo. Hāʻawi nā modula i kahi ala hou e hoʻonohonoho ai i ka code kumu e pili ana i ka wehewehe ʻana i nā palena o nā ʻāpana, me ka hoʻokomo ʻole ʻana i nā faila poʻomanaʻo ma o "#include".
  • Macro __VA_OPT__ no ka hoʻonui hoʻololi ʻana o nā macros ma muli o ke ʻano o nā hōʻailona ma ka hoʻopaʻapaʻa hoʻololi.
  • Kākoʻo no ka mea hoʻohana "" no ka hoʻohālikelike ʻekolu ala.
  • Kākoʻo no nā mea hoʻomaka mua no nā bitfields.
  • Hiki iā lambda ke hopu i nā huaʻōlelo "*keia".

    struct int_value {
    int n = 0;
    'akomi loaʻa_fn() {
    // INO:
    // ho'i [=]() { ho'i n; };

    // MAIKAʻI LOA:
    hoʻi [=, *kēia]() { hoʻi n; };
    }
    };

  • Ke kāhea ʻana i nā mea ma o ka pointer (Pointer-to-member), me ka hoʻohana ʻana i nā kuhikuhi i nā mea pōkole i wehewehe ʻia ma o ka ʻōlelo "const &".
  • ʻO ka mea hoʻohana holoi me kahi mea luku i wehewehe ʻia ma ka palapala P0722R1.
  • Ua ʻae ʻia nā papa e hoʻohana i nā ʻāpana template me ka ʻole o kahi ʻano.

    struct foo {
    foo() = paʻamau;
    constexpr foo(int) {}
    };

    laʻana
    auto loaʻa_foo() {
    hoʻihoʻi f;
    }

    loaʻa_foo(); // hoʻohana i ka mea hana implicit
    loaa_foo ();

  • Nā ʻōlelo lambda hoʻomau ʻole me ka mea hana.
  • ʻAe ʻia ka syntax template no nā ʻōlelo lambda (“auto f = [] (std::vector v)").
  • Hiki ke hoʻohana i nā string literals i nā ʻāpana template.
  • Kākoʻo no ka hoʻomaka ʻana o ke ʻano C - ʻaʻole i hoʻopaʻa inoa ʻia i ka papa inoa hoʻomaka.

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

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

  • Kākoʻo no nā lālā hoʻolālā ʻikepili hakahaka.
  • Kākoʻo i nā ʻano like ʻole a hiki ʻole ke hoʻomaopopo i ka mea hoʻoponopono e pili ana i ka hiki ke hoʻomaka ʻia ke kūkulu kūlana (“[[likely]] inā (random > 0) {“).
  • Hiki ke hoʻohana i nā pae e hoʻomaka i nā waiwai hoʻololi i kahi "no" loop

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

  • Ka helu 'akomi o ka nui o ka laha i ka mea hou (“new double[]{1,2,3}”);
  • ʻO ke ʻano “[[no_unique_address]]” kahi i hoʻololi ʻole ʻia ai ka ʻikepili me ka ʻole o ka ʻikepili.
  • Nā kuhikuhi atomika (std::atomic > a me std:: atomika >).
  • Hiki ke kāhea i nā hana virtual i nā ʻōlelo kūlana.
  • Kākoʻo no nā hana koke hiki ke hana me nā mea mau.

    consteval int sqr(int n) {
    hoʻi n * n;
    }

    constexpr int r = sqr(100); // OK
    int x = 100;
    int r2 = sqr(x); // ERROR: 'x' 'a'ole hiki ke ho'ohana ma ke 'ano he mau

  • Hiki ke hoʻohana i ka constexpr me nā hana virtual (“constexpr virtual int f() const { return 2; }”).
  • Ma ka waihona maʻamau:
    • Hoʻohui kākoʻo no ke ʻano char8_t no nā kaula UTF-8.
    • Hoʻohui ʻia nā faila poʻomanaʻo (bit operations) a me ka mana.
    • I kēia manawa hiki ke nānā i ka prefix a me ka suffix o nā kaula (starts_with, ends_with).
    • Hoʻohui ʻia std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible a me std::type_identity traits.
    • Hoʻohui ʻia nā hana std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated and std::assume_aligned.
    • Hoʻohui i ke kākoʻo no nā arrays i std :: make_shared.
    • Hoʻohui ʻia ka hana std::to_array e hoʻololi i nā mea like ʻole i std::array.
  • ʻOi aku ka maʻalahi o ka syntax helu helu:

    papa enum rgba_color_channel { ʻulaʻula, ʻōmaʻomaʻo, uliuli, alpha};

    std::nānā_kui i ke kaula(rgba_color_channel my_channel) {
    hoʻololi (my_channel) {
    hoʻohana i ka enum rgba_color_channel;
    hihia ʻulaʻula: hoʻihoʻi "ʻulaʻula";
    pahu ʻōmaʻomaʻo: hoʻihoʻi "'ōmaʻomaʻo";
    pahu blue: hoʻihoʻi i "blue";
    hihia alpha: hoʻihoʻi "alpha";
    }
    }

  • Ma nā papa kuhikuhi, ma muli o ke ʻano i wehewehe ʻole ʻia, ua pāpā ʻia ka hoʻohana ʻana i ka hana "," (“a[b,c]”). Ua hoʻopau ʻia ke kākoʻo no ka hapa nui o nā hana me nā ʻano like ʻole me ka huaʻōlelo volatile, me nā hana "++" a me "—" me nā ʻano maʻamau.
  • Hoʻemi ʻia ka helu o nā kūlana i koi ʻia ai ka "typename" e hōʻike i ke ʻano o kahi ʻano.

Source: opennet.ru

Pākuʻi i ka manaʻo hoʻopuka