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