ืชืงืŸ C++20 ืžืื•ืฉืจ

ื•ืขื“ืช ISO ืœืชืงื™ื ื” ืฉืœ ืฉืคืช C++ ืื•ืฉืจ ืชืงืŸ ื‘ื™ื ืœืื•ืžื™"C ++ 20". ื”ื™ื›ื•ืœื•ืช ื”ืžื•ืฆื’ื•ืช ื‘ืžืคืจื˜, ืœืžืขื˜ ืžืงืจื™ื ื‘ื•ื“ื“ื™ื, ื ืชืžื›ื™ื ื‘ืžื”ื“ืจื™ื GCC, ืงืœืื ื’ ะธ ืžื™ืงืจื•ืกื•ืคื˜ Visual C ++. ืกืคืจื™ื•ืช ืกื˜ื ื“ืจื˜ื™ื•ืช ื”ืชื•ืžื›ื•ืช ื‘-C++20 ืžื™ื•ืฉืžื•ืช ื‘ืชื•ืš ื”ืคืจื•ื™ืงื˜ ืœึฐื”ึทื’ื‘ึผึดื™ืจ.

ื‘ื—ื•ื“ืฉื™ื™ื ื”ืงืจื•ื‘ื™ื ื”ืžืคืจื˜ ื”ืžืื•ืฉืจ ื™ื”ื™ื” ื‘ืฉืœื‘ ื”ื›ื ืช ื”ืžืกืžืš ืœืคืจืกื•ื, ื‘ื• ืชืชื‘ืฆืข ืขื‘ื•ื“ื” ืขืœ ืชื™ืงื•ืŸ ืขืจื™ื›ื” ืฉืœ ืฉื’ื™ืื•ืช ื›ืชื™ื‘ ื•ืฉื’ื™ืื•ืช ื”ืงืœื“ื”. ื‘ืชื—ื™ืœืช ื ื•ื‘ืžื‘ืจ, ื”ืžืกืžืš ืฉื™ืชืงื‘ืœ ื™ื™ืฉืœื— ืœ-ISO ืœืคืจืกื•ื ืชื—ืช ื”ืฉื ื”ืจืฉืžื™ ISO/IEC 14882:2020. ื‘ื™ื ืชื™ื™ื, ื”ื•ื•ืขื“ื” ื›ื‘ืจ ื”ื—ืœื” ืœืขื‘ื•ื“ ืขืœ ืชืงืŸ C++23 ื”ื‘ื (C++2b) ื•ืชื‘ื—ืŸ ืืคืฉืจื•ื™ื•ืช ืืคืฉืจื™ื•ืช ื‘ืคื’ื™ืฉื” ื”ื•ื™ืจื˜ื•ืืœื™ืช ื”ื‘ืื” ืฉืœื”. ื—ื™ื“ื•ืฉื™ื.

ื”ืขื™ืงืจื™ ืชื›ื•ื ื•ืช C ++ 20 (ื“ื•ื’ืžืื•ืช ืงื•ื“):

  • ื ื•ืกืคื• "ืžื•ืฉื’ื™ื", ื”ืจื—ื‘ื•ืช ืชื‘ื ื™ืช, ื”ืžืืคืฉืจื•ืช ืœืš ืœื”ื’ื“ื™ืจ ืงื‘ื•ืฆื” ืฉืœ ื“ืจื™ืฉื•ืช ืคืจืžื˜ืจื™ื ืฉืœ ืชื‘ื ื™ืช ืฉื‘ื–ืžืŸ ื”ืงื•ืžืคื™ืœืฆื™ื” ืžื’ื‘ื™ืœื•ืช ืืช ืงื‘ื•ืฆืช ื”ืืจื’ื•ืžื ื˜ื™ื ืฉื ื™ืชืŸ ืœืงื‘ืœ ื›ืคืจืžื˜ืจื™ื ืฉืœ ืชื‘ื ื™ืช. ื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ืžื•ืฉื’ื™ื ื›ื“ื™ ืœืžื ื•ืข ื—ื•ืกืจ ืขืงื‘ื™ื•ืช ืœื•ื’ื™ืช ื‘ื™ืŸ ื”ืžืืคื™ื™ื ื™ื ืฉืœ ืกื•ื’ื™ ื”ื ืชื•ื ื™ื ื”ืžืฉืžืฉื™ื ื‘ืชื•ืš ื”ืชื‘ื ื™ืช ืœื‘ื™ืŸ ืžืืคื™ื™ื ื™ ืกื•ื’ ื”ื ืชื•ื ื™ื ืฉืœ ืคืจืžื˜ืจื™ ื”ืงืœื˜.

    ืชื‘ื ื™ืช
    ืžื•ืฉื’ EqualityComparable = requires(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • ืžึฐืงื•ึผื‘ึผึธืœ ื”ืจื—ื‘ื•ืช ืœืขื‘ื•ื“ื” ืขื ืžื•ื“ื•ืœื™ื ืฉื ื™ืชืŸ ืœื”ืฉืชืžืฉ ื‘ื”ื ื‘ืžืงื•ื ืงื‘ืฆื™ ื›ื•ืชืจืช. ืžื•ื“ื•ืœื™ื ืžืกืคืงื™ื ื“ืจืš ื—ื“ืฉื” ืœืืจื’ืŸ ืืช ืงื•ื“ ื”ืžืงื•ืจ ืขืœ ืกืžืš ื”ื’ื“ืจืช ื”ื’ื‘ื•ืœื•ืช ืฉืœ ืจื›ื™ื‘ื™ื, ืžื‘ืœื™ ืœื›ืœื•ืœ ืงื•ื‘ืฆื™ ื›ื•ืชืจืช ื‘ืืžืฆืขื•ืช "#include".
  • ืžืืงืจื• __VA_OPT__ ืœื”ืจื—ื‘ื” ืื“ืคื˜ื™ื‘ื™ืช ืฉืœ ืคืงื•ื“ื•ืช ืžืืงืจื• ืžืฉืชื ื•ืช ื‘ื”ืชืื ืœื ื•ื›ื—ื•ืช ืฉืœ ืืกื™ืžื•ื ื™ื ื‘ืืจื’ื•ืžื ื˜ ื”ืžืฉืชื ื”.
  • ืชืžื™ื›ื” ื‘ืžืคืขื™ืœ "" ืœื”ืฉื•ื•ืื” ืชืœืช ื›ื™ื•ื•ื ื™ืช.
  • ืชืžื™ื›ื” ื‘ืืชื—ื•ืœื™ ืืœืžื ื˜ื™ื ื”ืžื•ื’ื“ืจื™ื ื›ื‘ืจื™ืจืช ืžื—ื“ืœ ืขื‘ื•ืจ ืฉื“ื•ืช ืกื™ื‘ื™ื•ืช.
  • ื™ื›ื•ืœืช ืœืœื›ื•ื“ ืœืžื‘ื“ื” ื‘ื™ื˜ื•ื™ื™ื ืฉืœ "*ื–ื”".

    struct int_value {
    int n = 0;
    auto getter_fn() {
    //ืจึทืข:
    // return [=]() { return n; };

    // ื˜ื•ื‘:
    return [=, *this]() { return n; };
    }
    };

  • ืงืจื™ืื” ืœืืœืžื ื˜ื™ื ื‘ืืžืฆืขื•ืช ืžืฆื‘ื™ืข (ืžืฆื‘ื™ืข ืœืื™ื‘ืจ), ืฉื™ืžื•ืฉ ื‘ืžืฆื‘ื™ืขื™ื ืœืื•ื‘ื™ื™ืงื˜ื™ื ื–ืžื ื™ื™ื ื”ืžื•ื’ื“ืจื™ื ื‘ืืžืฆืขื•ืช ื”ื‘ื™ื˜ื•ื™ "const &".
  • ืžืคืขื™ืœ ื”ืžื—ื™ืงื” ืขื ื”ืจืก ื”ืžืชื•ืืจ ื‘ืžืกืžืš P0722R1.
  • ืžื—ืœืงื•ืช ืจืฉืื™ื•ืช ืœื”ืฉืชืžืฉ ื‘ืคืจืžื˜ืจื™ื ืฉืœ ืชื‘ื ื™ืช ืœืœื ืกื•ื’.

    struct foo {
    foo() = ื‘ืจื™ืจืช ืžื—ื“ืœ;
    constexpr foo(int) {}
    };

    ืชื‘ื ื™ืช
    auto get_foo() {
    ืœื—ื–ื•ืจ f;
    }

    get_foo(); // ืžืฉืชืžืฉ ื‘ื‘ื ืื™ ืžืจื•ืžื–
    get_foo ();

  • ื‘ื™ื˜ื•ื™ื™ ืœืžื‘ื“ื” ืœื ืงื‘ื•ืขื™ื ืขื ื‘ื ืื™.
  • ืžืืคืฉืจ ืชื—ื‘ื™ืจ ืชื‘ื ื™ืช ืขื‘ื•ืจ ื‘ื™ื˜ื•ื™ื™ ืœืžื‘ื“ื” ("auto f = [] (std::vector v)").
  • ื™ื›ื•ืœืช ืœื”ืฉืชืžืฉ ื‘ืžื™ืœื•ืœื™ ืžื—ืจื•ื–ืช ื‘ืคืจืžื˜ืจื™ื ืฉืœ ืชื‘ื ื™ืช.
  • ืชืžื™ื›ื” ื‘ืชื—ื‘ื™ืจ ืืชื—ื•ืœ ื‘ืกื’ื ื•ืŸ C - ืฉื“ื•ืช ืฉืื™ื ื ืจืฉื•ืžื™ื ื‘ืžืคื•ืจืฉ ื‘ืจืฉื™ืžืช ื”ืืชื—ื•ืœ ืžืื•ืชื—ืœื™ื ื›ื‘ืจื™ืจืช ืžื—ื“ืœ.

    ืžื‘ื ื” A {
    int x;
    int y;
    int z = 123;
    };

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

  • ืชืžื™ื›ื” ื‘ื—ื‘ืจื™ ืžื‘ื ื” ื ืชื•ื ื™ื ืจื™ืงื™ื.
  • ืชืžื™ื›ื” ื‘ืชื›ื•ื ื•ืช ื”ืกื‘ื™ืจื•ืช ื•ื”ื‘ืœืชื™ ืกื‘ื™ืจื•ืช ื›ื“ื™ ืœื™ื™ื“ืข ืืช ื”ืื•ืคื˜ื™ืžื™ื–ืฆื™ื” ืœื’ื‘ื™ ื”ื”ืกืชื‘ืจื•ืช ืฉื”ืžื‘ื ื” ื”ืžื•ืชื ื” ื™ื•ืคืขืœ ("[[ืกื‘ื™ืจ]] ืื (ืืงืจืื™ > 0) {").
  • ื™ื›ื•ืœืช ืœื”ืฉืชืžืฉ ื‘ื˜ื•ื•ื—ื™ื ื›ื“ื™ ืœืืชื—ืœ ืขืจื›ื™ ืžืฉืชื ื™ื ื‘ืœื•ืœืื” "ืขื‘ื•ืจ".

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

  • ื—ื™ืฉื•ื‘ ืื•ื˜ื•ืžื˜ื™ ืฉืœ ื’ื•ื“ืœ ื”ืžืขืจืš ื‘ื—ื“ืฉ ("ื›ืคื•ืœ ื—ื“ืฉ[]{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.
    • ื ื•ืกืคื• ืกื™ื‘ื™ื•ืช ืฉืœ ืงื‘ืฆื™ ื›ื•ืชืจืช (ืคืขื•ืœื•ืช ืกื™ื‘ื™ื•ืช) ื•ื’ืจืกื”.
    • ื›ืขืช ื ื™ืชืŸ ืœื‘ื“ื•ืง ืืช ื”ืงื™ื“ื•ืžืช ื•ื”ืกื™ื•ืžืช ืฉืœ ืžื—ืจื•ื–ื•ืช (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.
    • ื ื•ืกืคื” ืคื•ื ืงืฆื™ื™ืช std::to_array ืœื”ืžืจืช ืื•ื‘ื™ื™ืงื˜ื™ื ื“ืžื•ื™ื™ ืžืขืจืš ืœ-std::array.
  • ืชื—ื‘ื™ืจ ืกืคื™ืจื” ื ื•ื— ื™ื•ืชืจ:

    enum class rgba_color_channel { ืื“ื•ื, ื™ืจื•ืง, ื›ื—ื•ืœ, ืืœืคื };

    std::string_view to_string(rgba_color_channel my_channel) {
    switch (my_channel) {
    ื‘ืืžืฆืขื•ืช enum rgba_color_channel;
    ืžืงืจื” ืื“ื•ื: ื”ื—ื–ืจ "ืื“ื•ื";
    ืžืงืจื” ื™ืจื•ืง: ื”ื—ื–ืจ "ื™ืจื•ืง";
    ืžืงืจื” ื›ื—ื•ืœ: ื”ื—ื–ืจ "ื›ื—ื•ืœ";
    ืžืงืจื” ืืœืคื: ื”ื—ื–ืจ "ืืœืคื";
    }
    }

  • ื‘ืื™ื ื“ืงืกื™ื, ืขืงื‘ ื”ืชื ื”ื’ื•ืช ืœื ืžื•ื’ื“ืจืช, ื”ืฉื™ืžื•ืฉ ื‘ืคืขื•ืœื” "," ("a[b,c]") ืืกื•ืจ. ื”ืชืžื™ื›ื” ื‘ืจื•ื‘ ื”ืคืขื•ืœื•ืช ืขื ืžืฉืชื ื™ื ืฉื”ื•ื›ืจื–ื• ืขื ืžื™ืœืช ื”ืžืคืชื— ื”ืคื›ืคื›ื” ื”ื•ืคืกืงื”, ื›ื•ืœืœ ืคืขื•ืœื•ืช "++" ื•-"โ€”" ืขื ืกื•ื’ื™ื ืกื˜ื ื“ืจื˜ื™ื™ื.
  • ื”ืคื—ืชืช ืžืกืคืจ ื”ืžืฆื‘ื™ื ืฉื‘ื”ื ื ื“ืจืฉ "ืฉื ืกื•ื’" ืœืฆื™ื•ืŸ ื ื•ื›ื—ื•ืช ืฉืœ ื˜ื™ืคื•ืก.

ืžืงื•ืจ: OpenNet.ru

ื”ื•ืกืคืช ืชื’ื•ื‘ื”