• GCC 15 เพิ่มฟีเจอร์ C++26 จำนวนมาก และยังปรับปรุงฟีเจอร์บางส่วนของ C++23 ด้วย
  • ฟีเจอร์ที่เพิ่มเข้ามาหลัก ๆ ได้แก่ Pack Indexing, Variadic Friends, การระบุเหตุผลของการลบ, คำสั่งเงื่อนไขแบบ structured binding เป็นต้น
  • มีการเพิ่มออปชันคอมไพเลอร์และคำเตือนใหม่ ๆ เพื่อยกระดับ ประสบการณ์นักพัฒนา
  • มีการเสริมการรองรับ C++ modules และปรับแต่งประสิทธิภาพความเร็วในการคอมไพล์เทมเพลต
  • GCC 15 ถูกเลือกเป็นคอมไพเลอร์พื้นฐานของ Fedora 42 และจะพร้อมใช้งานใน Red Hat GCC Toolset ในเร็ว ๆ นี้

ฟีเจอร์ C++ ใหม่ใน GCC 15

  • GCC 15.1 เปิดตัวเมื่อวันที่ 25 เมษายน 2025 และเริ่มรองรับฟีเจอร์ C++26 อย่างจริงจัง
  • มาตรฐานเริ่มต้นยังคงเป็น gnu++17 และสามารถเปิดใช้ฟีเจอร์ใหม่ด้วย -std=c++23, -std=c++26 เป็นต้น
  • ฟีเจอร์ C++20, C++23 และ C++26 ยังถือเป็น experimental

ฟีเจอร์หลักของ C++26

  • Pack Indexing

    • สามารถเข้าถึงสมาชิกเฉพาะจากอาร์กิวเมนต์ของ Variadic Template ได้โดยตรงด้วยไวยากรณ์ pack...[N]
    • ทำให้อ้างอิงอาร์กิวเมนต์ตัวแรกและอื่น ๆ ได้อย่างสะอาดตาโดยไม่ต้องใช้เทคนิควนซ้ำ
  • การกำหนดแอตทริบิวต์ให้ Structured Bindings

    • สามารถใช้ [[attribute]] แยกกับตัวแปรแต่ละตัวที่ได้จาก structured binding ได้
    • ตัวอย่างเช่น สามารถกำหนด [[deprecated]] ให้เฉพาะตัวแปร binding บางตัวได้
  • เพิ่มคำอธิบายให้ฟังก์ชันที่ถูกลบ

    • ด้วยไวยากรณ์ = delete("เหตุผล") สามารถแสดง ข้อความ ในข้อผิดพลาดเมื่อมีการเรียกใช้ฟังก์ชันที่ถูกลบได้
  • Variadic Friends

    • ในคลาสเทมเพลตสามารถประกาศ friend ให้หลาย type พร้อมกันได้
    • มีประโยชน์ในการเสริมการควบคุมการเข้าถึง เช่น Passkey pattern
  • constexpr Placement New

    • สามารถใช้ std::allocator และ placement new ได้ในบริบท constexpr
  • การใช้ structured binding ในคำสั่งเงื่อนไข

    • สามารถประกาศ structured binding ภายในเงื่อนไขของ if, while, switch ได้
    • การตัดสินเงื่อนไขจะอาศัยตัวแปรภายในที่คอมไพเลอร์สร้างขึ้น
  • ห้ามลบ incomplete type

    • หากใช้ delete หรือ delete[] กับ incomplete type จะเกิดข้อผิดพลาดในการคอมไพล์ในโหมด C++26
  • คำเตือน Oxford comma

    • ในการประกาศฟังก์ชันแบบ variadic รูปแบบที่ใช้เพียง ... โดยไม่มี , ... จะถูกเตือนใน C++26
  • ยกเลิกการเปรียบเทียบอาร์เรย์

    • โค้ดที่ใช้ == เปรียบเทียบอาร์เรย์กับอาร์เรย์จะถูกมองเป็นข้อผิดพลาด
    • เดิมใน C++20 เป็นเพียงคำเตือน แต่ตอนนี้ถูกยกระดับเป็นข้อผิดพลาดคอมไพล์ในโหมด C++26
  • คำสั่ง #embed

    • รองรับ #embed สำหรับฝังข้อมูลไบนารีลงในซอร์สโค้ดโดยตรง

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น