ได้รับการรับรองมาตรฐาน C++20

คณะกรรมการ ISO ว่าด้วยการมาตรฐานของภาษา C++ ที่ได้รับการอนุมัติ มาตรฐานสากล "C ++ 20". ความสามารถที่นำเสนอในข้อกำหนด ยกเว้นกรณีที่แยกได้ ได้รับการสนับสนุน ในคอมไพเลอร์ GCC, เสียงดังกราว и Microsoft Visual C ++. ไลบรารีมาตรฐานที่รองรับ C++20 ได้รับการติดตั้งภายในโปรเจ็กต์ การส่งเสริม.

ในอีกสองเดือนข้างหน้า ข้อกำหนดที่ได้รับอนุมัติจะอยู่ในขั้นตอนการเตรียมเอกสารสำหรับการตีพิมพ์ โดยจะมีการดำเนินการแก้ไขข้อผิดพลาดในการสะกดคำและการพิมพ์ผิดทางบรรณาธิการ ในช่วงต้นเดือนพฤศจิกายน เอกสารผลลัพธ์จะถูกส่งไปยังไอเอสโอเพื่อเผยแพร่ภายใต้ชื่ออย่างเป็นทางการ ISO/IEC 14882:2020 ในระหว่างนี้ คณะกรรมการได้เริ่มทำงานกับมาตรฐาน C++23 (C++2b) ถัดไปแล้ว และจะพิจารณาทางเลือกที่เป็นไปได้ในการประชุมเสมือนครั้งถัดไป นวัตกรรม.

หลัก คุณสมบัติ C ++ 20 (ตัวอย่างโค้ด):

  • เพิ่ม "แนวคิด" ซึ่งเป็นส่วนขยายเทมเพลต ซึ่งช่วยให้คุณสามารถกำหนดชุดของข้อกำหนดพารามิเตอร์เทมเพลตที่จำกัดชุดของอาร์กิวเมนต์ที่สามารถรับเป็นพารามิเตอร์เทมเพลตได้ ณ เวลาคอมไพล์ แนวคิดนี้สามารถใช้เพื่อหลีกเลี่ยงความไม่สอดคล้องกันทางลอจิคัลระหว่างคุณสมบัติของชนิดข้อมูลที่ใช้ภายในเทมเพลตและคุณสมบัติชนิดข้อมูลของพารามิเตอร์อินพุต

    แม่แบบ
    แนวคิด EqualityComparable = ต้องการ (T a, T b) {
    { ก == ข } -> มาตรฐาน::บูลีน;
    { ก != ข } -> มาตรฐาน::บูลีน;
    };

  • ได้รับการยอมรับ การขยายตัว สำหรับการทำงานกับโมดูลที่สามารถใช้แทนไฟล์ส่วนหัวได้ โมดูลให้วิธีใหม่ในการจัดระเบียบซอร์สโค้ดตามการกำหนดขอบเขตของส่วนประกอบ โดยไม่ต้องรวมไฟล์ส่วนหัวผ่าน “#include”
  • Macro __VA_OPT__ สำหรับการขยายแบบปรับได้ของมาโครตัวแปร ขึ้นอยู่กับการมีอยู่ของโทเค็นในอาร์กิวเมนต์ของตัวแปร
  • รองรับตัวดำเนินการ "" สำหรับการเปรียบเทียบแบบสามทาง
  • รองรับตัวเริ่มต้นองค์ประกอบเริ่มต้นสำหรับบิตฟิลด์
  • ความสามารถในการแลมบ์ดาจับนิพจน์ "*this"

    โครงสร้าง int_value {
    อินท์ n = 0;
    getter_fn อัตโนมัติ () {
    //แย่:
    // กลับ [=]() { กลับ n; };

    // ดี:
    กลับ [=, *สิ่งนี้]() { กลับ n; };
    }
    };

  • การเรียกองค์ประกอบด้วยตัวชี้ (ตัวชี้ถึงสมาชิก) โดยใช้ตัวชี้ไปยังวัตถุชั่วคราวที่กำหนดผ่านนิพจน์ "const &"
  • ตัวดำเนินการลบพร้อมตัวทำลายที่อธิบายไว้ในเอกสาร P0722R1.
  • คลาสได้รับอนุญาตให้ใช้พารามิเตอร์เทมเพลตโดยไม่มีประเภท

    โครงสร้าง foo {
    foo() = ค่าเริ่มต้น;
    constexpr foo(int) {}
    };

    แม่แบบ
    อัตโนมัติ get_foo() {
    กลับ f;
    }

    get_foo(); // ใช้ตัวสร้างโดยนัย
    get_foo ();

  • นิพจน์แลมบ์ดาที่ไม่ถาวรพร้อมตัวสร้าง
  • การอนุญาตไวยากรณ์เทมเพลตสำหรับนิพจน์แลมบ์ดา (“auto f = [] (มาตรฐาน::vector วี)").
  • ความสามารถในการใช้ตัวอักษรสตริงในพารามิเตอร์เทมเพลต
  • รองรับไวยากรณ์การเริ่มต้นแบบ C - ฟิลด์ที่ไม่ได้ระบุไว้อย่างชัดเจนในรายการการเริ่มต้นจะถูกเตรียมใช้งานตามค่าเริ่มต้น

    โครงสร้าง A {
    intx;
    อินท์ วาย;
    อินท์ z = 123;
    };

    ก {.x = 1, .z = 2}; // ขวาน == 1, ใช่ == 0, az == 2

  • รองรับสมาชิกโครงสร้างข้อมูลที่ว่างเปล่า
  • การสนับสนุนแอตทริบิวต์ที่มีแนวโน้มและไม่น่าเป็นไปได้เพื่อแจ้งเครื่องมือเพิ่มประสิทธิภาพเกี่ยวกับความน่าจะเป็นของโครงสร้างตามเงื่อนไขที่ถูกทริกเกอร์ (“[[มีแนวโน้ม]] ถ้า (สุ่ม > 0) {“)
  • ความสามารถในการใช้ช่วงเพื่อเริ่มต้นค่าตัวแปรในลูป "for"

    สำหรับ (อัตโนมัติ v = std::vector{1, 2, 3}; auto& e : v) {

  • การคำนวณขนาดอาร์เรย์อัตโนมัติใน new (“new double[]{1,2,3}”);
  • คุณลักษณะ "[[no_unique_address]]" ซึ่งตัวแปรที่ไม่มีข้อมูลจะไม่กินพื้นที่
  • ตัวชี้อะตอม (std::atomic > และมาตรฐาน::อะตอมมิก >)
  • ความสามารถในการเรียกใช้ฟังก์ชันเสมือนในนิพจน์แบบมีเงื่อนไข
  • รองรับฟังก์ชั่นทันทีที่สามารถทำงานได้กับค่าคงที่เท่านั้น

    โครงสร้าง int sqr(int n) {
    กลับ n * n;
    }

    constexpr int r = sqr(100); // ตกลง
    อินท์ 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 rgba_color_channel { แดง เขียว น้ำเงิน อัลฟา };

    มาตรฐาน :: string_view to_string (rgba_color_channel my_channel) {
    สวิตช์ (my_channel) {
    ใช้ enum rgba_color_channel;
    กรณีสีแดง: กลับ "สีแดง";
    กรณีสีเขียว: กลับ "สีเขียว";
    กรณีสีน้ำเงิน: กลับ "สีน้ำเงิน";
    กรณีอัลฟ่า: ส่งคืน "อัลฟ่า";
    }
    }

  • ในดัชนี เนื่องจากพฤติกรรมที่ไม่ได้กำหนดไว้ จึงห้ามใช้การดำเนินการ ”,” (“a[b,c]”) การสนับสนุนสำหรับการดำเนินการส่วนใหญ่ที่มีการประกาศตัวแปรด้วยคำสำคัญระเหยได้ถูกยกเลิกแล้ว รวมถึงการดำเนินการ “++” และ “—” ที่มีประเภทมาตรฐาน
  • ลดจำนวนสถานการณ์ที่ต้องใช้ "ชื่อประเภท" เพื่อบ่งชี้ว่ามีประเภทอยู่

ที่มา: opennet.ru

เพิ่มความคิดเห็น