กลับไปหน้าบทความ

อ่าน 7 นาที

ซี++17

ซี++/ตระกูลภาษาการเขียนโปรแกรม C/มาตรฐานไออีซี/มาตรฐานไอเอสโอ/มาตรฐานภาษาโปรแกรม/ลิงก์ย้อนกลับเทมเพลต Webarchive

C++17เป็นเวอร์ชันหนึ่งของ มาตรฐาน ISO / IEC 14882 สำหรับ ภาษาโปรแกรม C++โดย C++17 ได้เข้ามาแทนที่เวอร์ชันก่อนหน้าของมาตรฐาน C++ ที่เรียกว่าC++14และต่อมาได้ถูกแทนที่ด้วยC++ 20

ซี++17

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 ]

ห้องสมุด

คุณสมบัติที่ถูกลบออก

การปรับปรุงภาษา 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 ]

ดูเพิ่มเติม

ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=C%2B%2B17&oldid=1352615548 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ ซี++17

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)...

คุณสมบัติใหม่

C++17 ได้นำเสนอคุณสมบัติใหม่มากมาย รายการต่อไปนี้อาจไม่ครบถ้วนสมบูรณ์

ภาษา

การทำให้ข้อความเป็น static_assert ตัวเลือก [ 5 ] อนุญาต typename (เป็นทางเลือกแทน class ) ใน template พารามิเตอร์เทมเพลต [ 6 ] กฎใหม่สำหรับ auto การหักล้างจาก braced-init-list [ 7 ] [ 8 ] คำจำกัดความเนมสเปซแบบซ้อนกัน เช่นแทนที่จะเป็น [ 8 ] [ 9 ] namespace X...