ฟีเจอร์ใหม่ใน C ++ 17 คืออะไร


1007

ตอนนี้ C ++ 17 เสร็จสมบูรณ์แล้วดังนั้นจึงไม่น่าจะมีการเปลี่ยนแปลงครั้งใหญ่ มีการเสนอข้อเสนอหลายร้อยรายการสำหรับ C ++ 17

คุณลักษณะใดบ้างที่ถูกเพิ่มลงใน C ++ ใน C ++ 17

เมื่อใช้คอมไพเลอร์ C ++ ที่รองรับ "C ++ 1z" ฟีเจอร์ใดบ้างที่จะใช้งานได้เมื่อคอมไพเลอร์อัพเดตเป็น C ++ 17?


26
รายการเต็มรูปแบบของคุณสมบัติตามเสียงดังกราว: ห้องสมุด , ภาษาหลัก
Kerrek SB

3
บล็อกนี้มีการสรุปที่ดี: bfilipek.com/2017/01/cpp17features.html
atb

13
ดูการเปลี่ยนแปลงอย่างเป็นทางการระหว่าง C ++ 14 และ C ++ 17 DIS (P0636r0)เอกสารสำหรับรายการการเปลี่ยนแปลงที่สำคัญจาก C ++ 14 เป็น C ++ 17
jotik

1
@RaghavNavada เยี่ยมมาก! มีการปรับปรุงส่วน C ++ 20 หรือไม่ มี# 53แต่ก็ปิด ...
LF

ทุกอย่างในไซต์นี้en.cppreference.com/w/cppถูกทำเครื่องหมายด้วยรุ่นที่ต้องการ
jw_

คำตอบ:


1266

คุณสมบัติภาษา:

เทมเพลตและรหัสทั่วไป

แลมบ์ดา

คุณลักษณะ

การล้างข้อมูลไวยากรณ์

การควบคุมการไหลย้อนกลับและการไหลที่สะอาดกว่า

  • การผูกโครงสร้าง

    • โดยทั่วไปชั้นแรกstd::tieด้วยauto
    • ตัวอย่าง:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • สร้างตัวแปรitและinsertedชนิดที่อนุมานได้จากpairที่map::insertผลตอบแทน
    • ทำงานร่วมกับ tuple / pair-like & std::arrays และ structs ที่ค่อนข้างแบน
    • ชื่อจริงผูกโครงสร้างในมาตรฐาน
  • if (init; condition) และ switch (init; condition)

    • if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
    • ขยายขอบเขตif(decl)ไปยังกรณีที่declไม่สามารถแปลงได้เป็นแบบบูลอย่างสมเหตุสมผล
  • การสรุปช่วงตามลูป

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

    • คุณลักษณะที่ร้องขอจำนวนมากเพื่อทำให้รหัสเกือบทั่วไปง่ายขึ้น

อื่น ๆ

การเพิ่มห้องสมุด:

ชนิดข้อมูล

  • std::variant<Ts...>

    • เกือบจะไม่ว่างเปล่าล่าสุดที่ฉันตรวจสอบใช่หรือไม่
    • ติดแท็กประเภทสหภาพ
    • {น่ากลัว | ประโยชน์}
  • std::optional

    • อาจถือหนึ่งในบางสิ่งบางอย่าง
    • มีประโยชน์อย่างน่าขัน
  • std::any

    • ถือหนึ่งในสิ่งใด ๆ (ที่สามารถคัดลอกได้)
  • std::string_view

    • std::string เช่นอาร์เรย์อ้างอิงถึงอักขระหรือสตริงย่อย
    • ไม่ต้องใช้เวลาstring const&อีกครั้ง ยังสามารถแยกวิเคราะห์ได้เร็วขึ้น bajillion ครั้ง
    • "hello world"sv
    • constexpr char_traits
  • std::byte ปิดมากกว่าที่พวกเขาสามารถเคี้ยว

    • ทั้งข้อมูลจำนวนเต็มและตัวอักษรเป็นเพียงข้อมูล

เรียกสิ่งต่างๆ

  • std::invoke
    • เรียก callable ใด ๆ (ตัวชี้ฟังก์ชั่นฟังก์ชั่นตัวชี้สมาชิก) ด้วยไวยากรณ์เดียว จากแนวคิด INVOKE มาตรฐาน
  • std::apply
    • ใช้ฟังก์ชั่นเหมือนและ tuple และคลาย tuple ลงในการโทร
  • std::make_from_tuple, std::applyนำมาใช้ในการคัดค้านการก่อสร้าง

  • is_invocable, is_invocable_r,invoke_result

ระบบไฟล์ TS v1

อัลกอริทึมใหม่

  • for_each_n

  • reduce

  • transform_reduce

  • exclusive_scan

  • inclusive_scan

  • transform_exclusive_scan

  • transform_inclusive_scan

  • เพิ่มเพื่อวัตถุประสงค์ในการเธรดโดยเปิดเผยแม้ว่าคุณจะไม่ได้ใช้เธรดก็ตาม

Threading

  • std::shared_mutex

    • untimed ซึ่งอาจมีประสิทธิภาพมากกว่าถ้าคุณไม่ต้องการ
  • atomic<T>::is_always_lockfree

  • scoped_lock<Mutexes...>

    • บันทึกstd::lockความเจ็บปวดบางอย่างเมื่อล็อค mutex มากกว่าหนึ่งครั้ง
  • Parallelism TS v1

    • กระดาษที่เชื่อมโยงจาก 2014 อาจล้าสมัย
    • stdอัลกอริทึมรุ่นขนานและเครื่องจักรที่เกี่ยวข้อง
  • ฮาร์ดแวร์ _ * _ interference_size

(บางส่วน) ความรู้พื้นฐานของห้องสมุด TS v1ไม่ครอบคลุมด้านบนหรือด้านล่าง

การปรับปรุงตู้คอนเทนเนอร์

การเปลี่ยนแปลงตัวชี้อัจฉริยะ

stdการปรับปรุงประเภทข้อมูลอื่น ๆ:

อื่น ๆ

ลักษณะ

เลิก

Isocpp.org มีรายการการเปลี่ยนแปลงที่เป็นอิสระตั้งแต่ C ++ 14; มันถูกปล้นส่วนหนึ่ง

โดยธรรมชาติแล้ว TS ทำงานต่อเนื่องกันดังนั้นจึงมีบาง TS ที่ยังไม่สุก - ที่จะต้องรอการทำซ้ำครั้งต่อไป เป้าหมายสำหรับการทำซ้ำครั้งถัดไปคือ C ++ 20 ตามที่วางแผนไว้ก่อนหน้านี้ไม่ใช่ C ++ 19 เนื่องจากมีข่าวลือบางอย่างบอกเป็นนัย หลีกเลี่ยงการใช้ C ++ 1O

รายการเริ่มต้นที่นำมาจากโพสต์Reddit นี้และโพสต์ Reddit นี้พร้อมลิงก์ที่เพิ่มผ่าน googling หรือจากหน้า isocpp.org ด้านบน

รายการเพิ่มเติมถูกปล้นจากรายการทดสอบคุณลักษณะSD-6

รายการคุณลักษณะของ clangและรายการคุณลักษณะห้องสมุดอยู่ถัดจากการถูกปล้น สิ่งนี้ดูเหมือนจะไม่น่าเชื่อถือเนื่องจากเป็น C ++ 1z ไม่ใช่ C ++ 17

สไลด์เหล่านี้มีคุณสมบัติบางอย่างขาดหายไปที่อื่น

ในขณะที่ไม่ได้ถามว่า "สิ่งที่ถูกลบ" นี่คือรายการสั้น ๆ ของบางสิ่ง ((ส่วนใหญ่?) คัดค้านก่อนหน้านี้) ที่ถูกลบใน C ++ 17 จาก C ++:

ลบ:

มีคำพูดซ้ำ ๆ ฉันไม่แน่ใจว่าสิ่งเหล่านี้มีผลกระทบกับรหัสหรือหากพวกเขาเป็นเพียงการสะสางในมาตรฐาน:

เอกสารที่ยังไม่ได้รวมเข้ากับด้านบน:

  • P0505R0 (constexpr chrono)

  • P0418R2 (การปรับแต่งอะตอม)

  • P0512R0 (ปรับแต่งการลดอาร์กิวเมนต์เทมเพลต)

  • P0490R0 (การปรับแต่งที่มีผลผูกพันโครงสร้าง)

  • P0513R0 (เปลี่ยนเป็นstd::hash)

  • P0502R0 (ข้อยกเว้นแบบขนาน)

  • P0509R1 (อัปเดตข้อ จำกัด เกี่ยวกับการจัดการข้อยกเว้น)

  • P0012R1 (ทำข้อกำหนดข้อยกเว้นเป็นส่วนหนึ่งของระบบประเภท)

  • P0510R0 (ข้อ จำกัด เกี่ยวกับชุดรูปแบบ)

  • P0504R0 (แท็กสำหรับทางเลือก / ชุดตัวเลือก / ใด ๆ )

  • P0497R0 (ปรับแต่ง PTR ที่ใช้ร่วมกัน)

  • P0508R0 (จับโหนดโครงสร้างที่จับ)

  • P0521R0 (ตัวชี้ที่ใช้ร่วมกันนับการใช้งานและการเปลี่ยนแปลงที่ไม่ซ้ำ?)

การเปลี่ยนแปลงข้อมูลจำเพาะ:

อ้างอิงเพิ่มเติม:


2
อืมmemory_order_consumeดูเหมือนจะไม่ถูกคัดค้านอย่างเป็นทางการ มันเป็นเพียงท้อในหมายเหตุ อาจเป็นเรื่องที่เหมาะสมที่จะพูดถึงเรื่องนี้ (ตัวอย่างเช่นวงเล็บ)
LF
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.