ซี++17
| การปรับปรุงภาษา C++ |
|---|
C++17เป็นเวอร์ชันหนึ่งของ มาตรฐาน ISO / IEC 14882 สำหรับ ภาษาโปรแกรม C++โดย C++17 ได้เข้ามาแทนที่เวอร์ชันก่อนหน้าของมาตรฐาน C++ ที่เรียกว่าC++14และต่อมาได้ถูกแทนที่ด้วยC++ 20
ประวัติศาสตร์
ก่อนที่คณะกรรมการมาตรฐาน C++ จะกำหนดรอบการเผยแพร่ 3 ปี วันที่เผยแพร่ของ C++17 ยังไม่แน่นอน ในช่วงเวลานั้น การแก้ไข C++17 ยังถูกเรียกว่าC++1zตามหลัง C++0x หรือ C++1x สำหรับ C ++11และ C++1y สำหรับC++14ข้อกำหนด C++17 มาถึงขั้นตอนร่างมาตรฐานสากล (DIS) ในเดือนมีนาคม 2017 [ 1 ] [ 2 ] DIS นี้ได้รับการอนุมัติอย่างเป็นเอกฉันท์ โดยมีเพียงความคิดเห็นด้านบรรณาธิการ[ 3 ]และมาตรฐานฉบับสุดท้ายได้รับการเผยแพร่เป็นISO/IEC 14882:2017ในเดือนธันวาคม 2017 [ 4 ]มีการเปลี่ยนแปลงเพียงเล็กน้อยในไลบรารีเทมเพลตมาตรฐาน C++ แม้ว่าอัลกอริทึม บางตัว ในส่วน<algorithm>หัวจะได้รับการสนับสนุนสำหรับการประมวลผลแบบขนาน อย่างชัดเจน และมีการปรับปรุง ไวยากรณ์ บางอย่าง
คุณสมบัติใหม่
C++17 ได้นำเสนอคุณสมบัติใหม่มากมาย รายการต่อไปนี้อาจไม่ครบถ้วนสมบูรณ์
ภาษา
- การทำให้ข้อความเป็น
static_assertตัวเลือก[ 5 ] - อนุญาต
typename(เป็นทางเลือกแทนclass) ในtemplateพารามิเตอร์เทมเพลต[ 6 ] - กฎใหม่สำหรับ
autoการหักล้างจาก braced-init-list [ 7 ] [ 8 ] - คำจำกัดความเนมสเปซแบบซ้อนกัน เช่นแทนที่จะเป็น[ 8 ] [ 9 ]
namespaceX::Y{...}namespaceX{namespaceY{...}} - อนุญาตให้ใช้แอตทริบิวต์สำหรับเนมสเปซและตัวแจงนับ[ 10 ] [ 11 ]
- คุณลักษณะมาตรฐานใหม่และ[ 12 ]
[[fallthrough]][[maybe_unused]][[nodiscard]] u8ตัวอักษรUTF-8 ( ) [ 10 ] [ 13 ] (ตัวอักษรสตริง UTF-8 มีมาตั้งแต่C++11 แล้ว ; C++17 เพิ่มตัวอักษรที่สอดคล้องกันเพื่อความสอดคล้องกัน แม้ว่าเนื่องจากถูกจำกัดไว้ที่ไบต์เดียว จึงสามารถจัดเก็บได้เฉพาะ " Basic Latin " และรหัสควบคุม C0 เท่านั้น เช่นASCII )- ตัวอักษรจุดลอยตัวเลขฐานสิบหก[ 14 ] [ 15 ]
- การใช้
autoเป็นประเภทสำหรับพารามิเตอร์เทมเพลตที่ไม่ใช่ประเภท[ 16 ] - การประเมินค่าคงที่สำหรับอาร์กิวเมนต์เทมเพลตที่ไม่ใช่ประเภททั้งหมด[ 10 ] [ 17 ]
- นิพจน์พับสำหรับเทมเพลตแบบแปรผัน[ 10 ] [ 18 ]
- สแตติกแบบคอมไพล์ไทม์
ifที่มีรูปแบบ[ 19 ]ifconstexpr(expression) - การประกาศการผูกโครงสร้างที่อนุญาตให้[ 20 ]
auto[a,b]=getTwoReturnValues(); - ตัวเริ่มต้นในคำสั่ง
ifและ[ 21 ]switch - การเริ่มต้นค่าโดยการคัดลอกและการเริ่มต้นค่าโดยตรงของอ็อบเจ็กต์ประเภท
Tจากนิพจน์ prvalue ของประเภทT(โดยไม่สนใจตัวกำหนดคุณสมบัติ cv ระดับบนสุด) จะส่งผลให้ไม่มีตัวสร้างการคัดลอกหรือการย้ายจากนิพจน์ prvalue ดูข้อมูลเพิ่มเติมได้ที่ หัวข้อการละเว้นการ คัดลอก (copy elision ) - ส่วนขยายบางส่วนเกี่ยวกับการจัดสรรหน่วยความจำที่จัดเรียงเกิน[ 22 ]
- การอนุมานอาร์กิวเมนต์เทมเพลตคลาส (CTAD) โดยแนะนำแนวทางการอนุมานตัวสร้าง เช่น อนุญาตให้ใช้ประเภทอาร์กิวเมนต์ตัวสร้างแทนที่จะต้องใช้ฟังก์ชันเทมเพลตตัวช่วยเพิ่มเติม [ 23 ] [ 24 ]
std::pair(5.0,false)std::pair<double,bool>(5.0,false)std::make_pair(5.0,false) - ตัวแปรแบบอินไลน์ ช่วยให้สามารถกำหนดตัวแปรในไฟล์ส่วนหัวได้โดยไม่ละเมิดกฎการกำหนดตัวแปรเพียงครั้งเดียวกฎเหล่านี้โดยพื้นฐานแล้วเหมือนกับฟังก์ชันแบบอินไลน์
__has_includeอนุญาตให้ตรวจสอบความพร้อมใช้งานของส่วนหัวโดยใช้คำสั่งพรีโปรเซสเซอร์[ 25 ]- ค่าของ
__cplusplusเปลี่ยนเป็น201703L[ 26 ] - ข้อกำหนดข้อยกเว้นเป็นส่วนหนึ่งของประเภทฟังก์ชัน[ 27 ]
- นิพจน์แลมบ์ดาสามารถจับ "
*this" โดยค่า[ 28 ]
ห้องสมุด
- เนื้อหาส่วนใหญ่ของ Library Fundamentals TS I รวมถึง: [ 29 ] [ 30 ]
<string_view>ส่วนหัว:std::string_viewการอ้างอิงแบบอ่านอย่างเดียวที่ไม่เป็นเจ้าของลำดับอักขระหรือสตริงสไลซ์[ 31 ]<optional>:std::optionalสำหรับใช้แทนอ็อบเจ็กต์เสริมซึ่งเป็นชนิดข้อมูลที่อาจไม่ได้ถูกส่งคืนโดยอัลกอริทึมที่กำหนดเสมอไป โดยรองรับการไม่ส่งคืนค่า<any>:std::any, สำหรับใช้แทนประเภทใดๆซึ่งเก็บค่าเดียวของประเภทใดๆ ก็ได้
std::uncaught_exceptionsแทนที่std::uncaught_exceptionในการจัดการข้อยกเว้น [ 32 ] [ 10 ] ตั้งอยู่ใน<exception>นับuncaught_exceptionsจำนวนข้อยกเว้นในเธรดปัจจุบันที่ถูกโยน/โยนซ้ำและยังไม่ได้เข้าสู่catchเงื่อนไขที่ตรงกัน ในขณะที่uncaught_exceptionตรวจจับเฉพาะว่าการคลายสแต็กกำลังดำเนินการอยู่หรือไม่- ฟังก์ชันการแทรกใหม่
try_emplaceและinsert_or_assignสำหรับโครงสร้างข้อมูลแบบเชื่อมโยงคีย์-ค่าstd::map(แผนที่ต้นไม้) และstd::unordered_map(แผนที่แฮช) [ 33 ] [ 34 ] - การ เข้าถึงคอนเทนเนอร์แบบสม่ำเสมอ:
std::sizeและstd::empty[ 34 ]std::data[ 35 ] - นิยามของ " ตัววนซ้ำ ที่ต่อเนื่อง " [ 34 ] [ 36 ]
<filesystem>: ไลบรารีระบบไฟล์std::filesystem(อ้างอิงจากboost::filesystem) [ 37 ]- เวอร์ชัน คู่ขนานของ อัลก อริธึมSTL [ 38 ]
<cmath>: ฟังก์ชันพิเศษทางคณิตศาสตร์เพิ่มเติมรวมถึงอินทิกรัลเชิงวงรีและฟังก์ชันเบสเซล[ 39 ]<variant>:std::variant, คอนเทนเนอร์ยูเนียนที่มีแท็ก[ 40 ]std::byteอนุญาตให้แทนที่อักขระ สำหรับประเภทข้อมูลที่ตั้งใจจะจำลอง ไบต์ของข้อมูลเป็นไบต์แทนที่จะเป็นอักขระ[ 41 ]- คุณลักษณะตัวดำเนินการตรรกะ:
std::conjunction,std::disjunctionและstd::negation[ 42 ] <memory_resource>ส่วนหัวสำหรับทรัพยากรหน่วยความจำแบบโพลีมอร์ฟิก[ 43 ]
คุณสมบัติที่ถูกลบออก
การปรับปรุงภาษา C++ ครั้งนี้ไม่เพียงแต่เพิ่มคุณสมบัติใหม่ แต่ยังได้ลบคุณสมบัติบางอย่างออกไปด้วย
- ไตรกราฟถูกลบออก[ 44 ] [ 45 ]
- ประเภทและฟังก์ชันที่เลิกใช้แล้วบางส่วนถูกลบออกจากไลบรารีมาตรฐานรวมถึง
std::auto_ptr,std::random_shuffle, และตัวปรับฟังก์ชันเก่า[ 8 ] [ 46 ]สิ่งเหล่านี้ถูกแทนที่ใน C++11 ด้วยสิ่งอำนวยความสะดวกที่ได้รับการปรับปรุง เช่นstd::unique_ptr,std::shuffle,std::bind, และแลมบ์ดา - การใช้คำหลัก (ที่เคยถูกยกเลิก)
registerเป็นตัวระบุคลาสการจัดเก็บถูกลบออก[ 47 ]คำหลักนี้ยังคงสงวนไว้แต่ปัจจุบันไม่ได้ใช้งานแล้ว
การสนับสนุนคอมไพเลอร์
- GCCมีการสนับสนุนคุณสมบัติภาษา C++17 อย่างสมบูรณ์ตั้งแต่เวอร์ชัน 8 [ 48 ]
- Clang 5 และเวอร์ชันที่ใหม่กว่ารองรับคุณสมบัติภาษา C++17 ทั้งหมด[ 49 ]
- Visual Studio 2017 15.8 (MSVC 19.15) และเวอร์ชันที่ใหม่กว่ารองรับคุณสมบัติภาษา C++17 ทั้งหมด[ 50 ] [ 51 ]
การสนับสนุนห้องสมุด
- libstdc++ ตั้งแต่เวอร์ชัน 9.1 รองรับ C++17 อย่างสมบูรณ์ (8.1 โดยไม่มี Parallelism TS และอ้างอิงถึง C99 แทน C11) [ 52 ]
- libc++ เวอร์ชัน 9 รองรับ C++17 เพียงบางส่วน ส่วนที่เหลือ "อยู่ระหว่างดำเนินการ" [ 53 ]
- Visual Studio 2017 15.8 (MSVC 19.15) Standard Library และเวอร์ชันที่ใหม่กว่ารองรับคุณสมบัติไลบรารี C++17 ทั้งหมด ยกเว้น "การแปลงสตริงพื้นฐาน" และการอ้างอิงถึง C99 แทนที่จะเป็น C11 "การแปลงสตริงพื้นฐาน" ถูกเพิ่มเข้ามาในVisual Studio 2019 16.4 [ 54 ]