C++20 ํ‘œ์ค€ ์Šน์ธ

C++ ์–ธ์–ด ํ‘œ์ค€ํ™”์— ๊ด€ํ•œ ISO ์œ„์›ํšŒ ์Šน์ธ ๋œ ๊ตญ์ œ ํ‘œ์ค€ "C ++ 20". ๊ฒฉ๋ฆฌ๋œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ  ์‚ฌ์–‘์— ์ œ์‹œ๋œ ๊ธฐ๋Šฅ์€ ์ง€์›๋จ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ GCC, ๊ทธ ์†Œ๋ฆฌ ะธ Microsoft Visual C ++. C++20์„ ์ง€์›ํ•˜๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ์ƒ์Šน.

๋‹ค์Œ 14882๊ฐœ์›” ๋™์•ˆ ์Šน์ธ๋œ ์‚ฌ์–‘์€ ์ถœํŒ์„ ์œ„ํ•œ ๋ฌธ์„œ ์ค€๋น„ ๋‹จ๊ณ„์— ์žˆ์„ ๊ฒƒ์ด๋ฉฐ, ์ด ๋‹จ๊ณ„์—์„œ ์ฒ ์ž ์˜ค๋ฅ˜ ๋ฐ ์˜คํƒ€์— ๋Œ€ํ•œ ํŽธ์ง‘ ์ˆ˜์ • ์ž‘์—…์ด ์ˆ˜ํ–‰๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. 2020์›” ์ดˆ์— ์ตœ์ข… ๋ฌธ์„œ๋Š” ISO/IEC 23:2์ด๋ผ๋Š” ๊ณต์‹ ์ด๋ฆ„์œผ๋กœ ๋ฐœํ–‰๋˜๊ธฐ ์œ„ํ•ด ISO๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ๊ทธ ๋™์•ˆ ์œ„์›ํšŒ๋Š” ์ด๋ฏธ ๋‹ค์Œ C++XNUMX ํ‘œ์ค€(C++XNUMXb)์— ๋Œ€ํ•œ ์ž‘์—…์„ ์‹œ์ž‘ํ–ˆ์œผ๋ฉฐ ๋‹ค์Œ ๊ฐ€์ƒ ํšŒ์˜์—์„œ ๊ฐ€๋Šฅํ•œ ์˜ต์…˜์„ ๊ณ ๋ คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜์‹ .

์ฃผ์š” ํŠน์ง• C ++ 20 (์ฝ”๋“œ ์˜ˆ์‹œ):

  • ์ปดํŒŒ์ผ ํƒ€์ž„์— ํ…œํ”Œ๋ฆฟ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ—ˆ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ์ธ์ˆ˜ ์ง‘ํ•ฉ์„ ์ œํ•œํ•˜๋Š” ํ…œํ”Œ๋ฆฟ ๋งค๊ฐœ๋ณ€์ˆ˜ ์š”๊ตฌ ์‚ฌํ•ญ ์ง‘ํ•ฉ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ…œํ”Œ๋ฆฟ ํ™•์žฅ์ธ "๊ฐœ๋…"์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋…์€ ํ…œํ”Œ๋ฆฟ ๋‚ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ ์œ ํ˜•์˜ ์†์„ฑ๊ณผ ์ž…๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋ฐ์ดํ„ฐ ์œ ํ˜• ์†์„ฑ ๊ฐ„์˜ ๋…ผ๋ฆฌ์  ๋ถˆ์ผ์น˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ์ฃผํ˜•
    ๊ฐœ๋… EqualityComparable = ์š”๊ตฌ(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • ์ˆ˜๋ฝ๋จ ํ™•์žฅ ํ—ค๋” ํŒŒ์ผ ๋Œ€์‹  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“ˆ ์ž‘์—…์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์€ "#include"๋ฅผ ํ†ตํ•ด ํ—ค๋” ํŒŒ์ผ์„ ํฌํ•จํ•˜์ง€ ์•Š๊ณ  ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ฒฝ๊ณ„ ์ •์˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณ€์ˆ˜ ์ธ์ˆ˜์— ํ† ํฐ์ด ์žˆ๋Š”์ง€์— ๋”ฐ๋ผ ๊ฐ€๋ณ€ ๋งคํฌ๋กœ๋ฅผ ์ ์‘ํ˜•์œผ๋กœ ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋งคํฌ๋กœ __VA_OPT__.
  • XNUMX๋ฐฉํ–ฅ ๋น„๊ต๋ฅผ ์œ„ํ•ด "" ์—ฐ์‚ฐ์ž๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„ํŠธ ํ•„๋“œ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์š”์†Œ ์ด๋‹ˆ์…œ๋ผ์ด์ €๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ๋žŒ๋‹ค์—์„œ "*this" ํ‘œํ˜„์‹์„ ์บก์ฒ˜ํ•˜๋Š” ๊ธฐ๋Šฅ.

    ๊ตฌ์กฐ์ฒด int_value {
    ์ •์ˆ˜ n = 0;
    ์ž๋™ getter_fn() {
    //๋‚˜์œ:
    // return [=]() { return n; };

    // ์ข‹์€:
    return [=, *this]() { return n; };
    }
    };

  • "const &" ํ‘œํ˜„์‹์„ ํ†ตํ•ด ์ •์˜๋œ ์ž„์‹œ ๊ฐœ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํฌ์ธํ„ฐ(๋ฉค๋ฒ„์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ)๋กœ ์š”์†Œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฌธ์„œ์— ์„ค๋ช…๋œ ์†Œ๋ฉธ์ž๊ฐ€ ์žˆ๋Š” ์‚ญ์ œ ์—ฐ์‚ฐ์ž P0722R1.
  • ํด๋ž˜์Šค๋Š” ์œ ํ˜• ์—†์ด ํ…œํ”Œ๋ฆฟ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๊ตฌ์กฐ์ฒด foo {
    foo() = ๊ธฐ๋ณธ๊ฐ’;
    constexpr foo(int) {}
    };

    ์ฃผํ˜•
    ์ž๋™ get_foo() {
    f๋ฅผ ๋ฐ˜ํ™˜;
    }

    get_foo(); // ์•”์‹œ์  ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    get_foo ();

  • ์ƒ์„ฑ์ž๊ฐ€ ์žˆ๋Š” ๋น„์ง€์†์  ๋žŒ๋‹ค ์‹์ž…๋‹ˆ๋‹ค.
  • ๋žŒ๋‹ค ํ‘œํ˜„์‹์— ๋Œ€ํ•œ ํ…œํ”Œ๋ฆฟ ๊ตฌ๋ฌธ ํ—ˆ์šฉ("auto f = [] (ํ‘œ์ค€::๋ฒกํ„ฐ V)").
  • ํ…œํ”Œ๋ฆฟ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋ฌธ์ž์—ด ๋ฆฌํ„ฐ๋Ÿด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ.
  • C ์Šคํƒ€์ผ ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ์ง€์› - ์ดˆ๊ธฐํ™” ๋ชฉ๋ก์— ๋ช…์‹œ์ ์œผ๋กœ ๋‚˜์—ด๋˜์ง€ ์•Š์€ ํ•„๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.

    ๊ตฌ์กฐ์ฒด A {
    int x;
    ์ •์ˆ˜ Y;
    ์ •์ˆ˜ z = 123;
    };

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

  • ๋นˆ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋ฉค๋ฒ„๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์กฐ๊ฑด๋ถ€ ๊ตฌ๋ฌธ์ด ํŠธ๋ฆฌ๊ฑฐ๋  ํ™•๋ฅ ์— ๋Œ€ํ•ด ์ตœ์ ํ™” ํ”„๋กœ๊ทธ๋žจ์— ์•Œ๋ฆฌ๋Š” ๊ฐ€๋Šฅ์„ฑ ๋ฐ ๊ฐ€๋Šฅ์„ฑ ์—†์Œ ์†์„ฑ ์ง€์›("[[likely]] if (random > 0) {").
  • ๋ฒ”์œ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ "for" ๋ฃจํ”„์—์„œ ๋ณ€์ˆ˜ ๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ธฐ๋Šฅ

    for (auto v = std::๋ฒกํ„ฐ{1, 2, 3}; auto& e : v) {

  • new์˜ ๋ฐฐ์—ด ํฌ๊ธฐ ์ž๋™ ๊ณ„์‚ฐ(โ€œnew double[]{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 virtual int f() const { return 2; }")์™€ ํ•จ๊ป˜ constexpr์„ ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ.
  • ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ:
    • UTF-8 ๋ฌธ์ž์—ด์— ๋Œ€ํ•œ char8_t ์œ ํ˜•์— ๋Œ€ํ•œ ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ํ—ค๋” ํŒŒ์ผ ๋น„ํŠธ(๋น„ํŠธ ์—ฐ์‚ฐ) ๋ฐ ๋ฒ„์ „์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    • ์ด์ œ ๋ฌธ์ž์—ด์˜ ์ ‘๋‘์‚ฌ์™€ ์ ‘๋ฏธ์‚ฌ(starts_with, end_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::array๋กœ ๋ณ€ํ™˜ํ•˜๋Š” std::to_array ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋”์šฑ ํŽธ๋ฆฌํ•œ ์—ด๊ฑฐํ˜• ๊ตฌ๋ฌธ:

    enum class rgba_color_channel { ๋นจ๊ฐ•, ๋…น์ƒ‰, ํŒŒ๋ž‘, ์•ŒํŒŒ };

    std::string_view to_string(rgba_color_channel my_channel) {
    ์Šค์œ„์น˜(my_channel) {
    enum rgba_color_channel ์‚ฌ์šฉ;
    ์ผ€์ด์Šค ๋นจ๊ฐ„์ƒ‰: "๋นจ๊ฐ„์ƒ‰"์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    ๋…น์ƒ‰์ธ ๊ฒฝ์šฐ: "๋…น์ƒ‰"์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    ํŒŒ๋ž€์ƒ‰์˜ ๊ฒฝ์šฐ: "ํŒŒ๋ž€์ƒ‰"์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    ์ผ€์ด์Šค ์•ŒํŒŒ: "์•ŒํŒŒ"๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    }
    }

  • ์ธ๋ฑ์Šค์—์„œ๋Š” ์ •์˜๋˜์ง€ ์•Š์€ ๋™์ž‘์œผ๋กœ ์ธํ•ด ","("a[b,c]") ์—ฐ์‚ฐ์˜ ์‚ฌ์šฉ์ด ๊ธˆ์ง€๋ฉ๋‹ˆ๋‹ค. ํ‘œ์ค€ ์œ ํ˜•์˜ "++" ๋ฐ "โ€”" ์ž‘์—…์„ ํฌํ•จํ•˜์—ฌ ํœ˜๋ฐœ์„ฑ ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์— ๋Œ€ํ•œ ์ง€์›์ด ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์œ ํ˜•์˜ ์กด์žฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด "typename"์ด ํ•„์š”ํ•œ ์ƒํ™ฉ์˜ ์ˆ˜๊ฐ€ ์ค„์—ˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€