C ++ 14 เพิ่มคีย์เวิร์ดใหม่ใน C ++ หรือไม่


103

คณะกรรมการมาตรฐาน C ++ มีแนวโน้มที่จะหลีกเลี่ยงการเพิ่มคำหลักใหม่ในภาษา แต่ C ++ 11 นั้นไม่เป็นเช่นนั้น ตัวอย่างบางส่วน:

constexpr
decltype
thread_local
auto // New usage
noexcept
nullptr
static_assert
alignof
alignas

มีคำหลักใหม่ ๆ ที่ใช้กับ C ++ 14 หรือไม่?

คำตอบ:


135

ตารางที่ 4 (คำหลัก) ใน N3936 (C ++ 14):

alignas           continue          friend            register          true
alignof           decltype          goto              reinterpret_cast  try
asm               default           if                return            typedef
auto              delete            inline            short             typeid
bool              do                int               signed            typename
break             double            long              sizeof            union
case              dynamic_cast      mutable           static            unsigned
catch             else              namespace         static_assert     using
char              enum              new               static_cast       virtual
char16_t          explicit          noexcept          struct            void
char32_t          export            nullptr           switch            volatile
class             extern            operator          template          wchar_t
const             false             private           this              while
constexpr         float             protected         thread_local
const_cast        for               public            throw

ตารางที่ 4 ใน N3337 (C ++ 11):

alignas           continue          friend            register          true
alignof           decltype          goto              reinterpret_cast  try
asm               default           if                return            typedef
auto              delete            inline            short             typeid
bool              do                int               signed            typename
break             double            long              sizeof            union
case              dynamic_cast      mutable           static            unsigned
catch             else              namespace         static_assert     using
char              enum              new               static_cast       virtual
char16_t          explicit          noexcept          struct            void
char32_t          export            nullptr           switch            volatile
class             extern            operator          template          wchar_t
const             false             private           this              while
constexpr         float             protected         thread_local
const_cast        for               public            throw

... ซึ่งเป็นวิธีพูดที่ยืดยาวว่า "ไม่"

( overrideและfinalเป็น "ตัวระบุที่มีความหมายพิเศษ" และแสดงอยู่ในตารางที่ 3 andฯลฯ คือ "การแสดงทางเลือก ... สำหรับตัวดำเนินการและเครื่องหมายวรรคตอนบางรายการ" และแสดงอยู่ในตารางที่ 5 ตารางทั้งสองไม่มีการเปลี่ยนแปลงระหว่าง C ++ 11 และ C ++ 14. )


2
ฉันจะบอกว่านั่นเป็นเพราะพวกเขาถูกใส่ไว้ในเนมสเปซสากลของทุกหน่วยการแปล (ใช่คุณสามารถถามว่าทำไมถึงเป็นเช่นนั้นแล้วก็ ... )
R.Martinho Fernandes

2
เป็นregisterคำหลักที่ยังคงมีประโยชน์หรือใช้ใน c ++ ใหม่ 11 รหัส?
Walter

2
@ Walter มันเลิกใช้งานและคอมไพเลอร์ละเว้นอย่างกว้างขวาง
TC

1
ราชสกุลทางเลือกสำหรับผู้ประกอบการตรรกะไม่ได้กล่าวถึงในตารางเหล่านั้นหรือไม่ ไม่ใช่คีย์เวิร์ด C ++?
Nikos Athanasiou

1
@NikosAthanasiou มีโต๊ะสำหรับผู้ที่อยู่ภายใต้ IIRC นี้
chris

85

ฉันโพสต์คำตอบนี้เพื่อเป็นเครื่องมือในการค้นหาคำตอบสำหรับคำถามที่คล้ายกัน

ปัจจุบันร่างมาตรฐานถูกเก็บไว้ในที่เก็บ GitHub สาธารณะ นั่นหมายความว่าคุณสามารถถามคำถามนี้กับ GitHub ได้!

source/lex.texตารางคำหลักที่อยู่ในแฟ้ม หากคุณตำหนิมันเราจะพบว่าการเปลี่ยนแปลงครั้งล่าสุดของตารางคำหลักเกิดขึ้นในเดือนสิงหาคม 2554 (จริงๆแล้วเป็นการกระทำครั้งแรก: ตารางนั้นไม่ได้เปลี่ยนแปลงเนื่องจาก repo เริ่มใช้งานจริงในช่วงเวลา C ++ 11 กำลังดำเนินการสรุป)

อีกทางเลือกหนึ่งที่เราสามารถขอให้ GitHub เปรียบเทียบร่างทั้งสองฉบับที่ส่งไปเพื่อลงคะแนนสำหรับมาตรฐานทั้งสองเวอร์ชัน: N3337 และ N3936 ความแตกต่างระหว่างสองรายการนี้แสดงให้เห็นว่าการเปลี่ยนแปลงที่เกิดขึ้นlex.texไม่ได้เปลี่ยนแปลงอะไรในตารางคำหลัก


1
ขอบคุณสำหรับสิ่งนี้! ดูเหมือนวันนี้จะยังไม่มีการเปลี่ยนแปลงใด ๆ
sbi

34

จะไม่มีการเพิ่มคำหลักใหม่ด้วย C ++ 14 สิ่งนี้ไม่น่าแปลกใจเนื่องจาก C ++ 14 มีจุดมุ่งหมายเพื่อการอัปเกรดขนาดเล็กเป็น C ++ 11 ส่วนใหญ่เกี่ยวข้องกับการล้างจุดบกพร่องและการปรับปรุงขนาดเล็กผลกระทบต่ำ การเปลี่ยนแปลงที่สำคัญครั้งต่อไปน่าจะเป็น C ++ '17' ซึ่งฉันคาดหวังคำหลักใหม่อีกครั้ง

คณะกรรมการมาตรฐาน C ++ มีแนวโน้มที่จะหลีกเลี่ยงการเพิ่มคำหลักใหม่ในภาษา แต่ C ++ 11 นั้นไม่เป็นเช่นนั้น

ฉันคิดว่ามันคุ้มค่าที่จะพิจารณาว่าเหตุใดคณะกรรมการจึงหลีกเลี่ยงการเพิ่มคำหลักใหม่ (และบังเอิญว่าทำไมคุณถึงใส่ผิดautoในรายการของคุณ) ปัญหาหลักของคีย์เวิร์ดใหม่คือใน C ++ คุณไม่สามารถใช้คีย์เวิร์ดเป็นตัวระบุได้ซึ่งหมายความว่าการเพิ่มคีย์เวิร์ดใหม่จะทำลายโค้ดที่มีอยู่ เปลี่ยนวัตถุประสงค์autoแล้วไม่ได้ทำลายกฎของพวกเขาเพราะไม่มีรหัสที่มีอยู่สามารถใช้autoเป็นตัวระบุอยู่แล้ว

ดังนั้นในการยอมรับคีย์เวิร์ดใหม่จำเป็นต้องมีเหตุผลที่มากกว่าค่าใช้จ่ายของการปะทะที่อาจเกิดขึ้นกับโค้ดที่มีอยู่และไม่มีวิธีที่สมเหตุสมผลในการนำสิ่งเดียวกันไปใช้โดยไม่ต้องใช้คีย์เวิร์ดใหม่ ในกรณีของ C ++ 11 คณะกรรมการยอมรับข้อเสนอบางประการที่ต้องใช้คีย์เวิร์ดใหม่เนื่องจากพวกเขารู้สึกว่าผลประโยชน์นั้นมีมากกว่าต้นทุนไม่ใช่เพราะพวกเขาไม่เกลียดที่จะเพิ่มคำหลักใหม่

นอกจากนี้ยังเป็นเหตุผลว่าทำไมหากคุณมองลงไปในรายการที่คุณให้ไว้แต่ละคำจะเป็นคำหลักแบบผสมเนื่องจากจะช่วยลดโอกาสที่พวกเขาจะปะทะกับตัวระบุที่มีอยู่


1
"C ++" 17 "ที่ฉันคาดหวังคำหลักใหม่อีกครั้ง": ในที่สุด C ++ จะหยุดเติบโตหรือไม่?
Giorgio

2
@Giorgio ซอฟต์แวร์และฮาร์ดแวร์จะหยุดพัฒนาในที่สุดหรือไม่? ประเด็นใหญ่ที่ว่านี้คือคุณสามารถตัดสินใจอย่างกล้าหาญและทิ้งไวยากรณ์ที่ "เก่า" ทิ้งรหัสเก่าและดำเนินการกับส่วนที่พัฒนาของภาษาได้หรือไม่ Python พยายามทำอย่างนั้น
Lorah Attkins

2
@NorahAttkins: เห็นได้ชัดว่าซอฟต์แวร์ต้องมีการพัฒนา แต่การเติบโตของภาษาไปเรื่อย ๆ ไม่ใช่ทางออกเดียว: เมื่อภาษาเป็นผู้ใหญ่สำหรับบางช่องคุณสามารถทำลายความเข้ากันได้และเริ่มภาษาใหม่เพื่อตอบสนองความต้องการของกลุ่มใหม่ ๆ Python เป็นตัวอย่างหนึ่ง ตัวอย่างอื่น ๆ ได้แก่ C ++ -> Java, Java -> Scala, Common Lisp -> Clojure, C ++ -> D บางภาษาเติบโตไปเรื่อย ๆ เนื่องจากชุมชนของพวกเขาเชื่อมั่นว่าภาษาโปรดของพวกเขาเป็นภาษาที่แท้จริงเพียงภาษาเดียวและพวกเขาต้องการ เพื่อให้เหมาะกับทุกพื้นที่การใช้งานที่เป็นไปได้ แน่นอนความคาดหวังนี้ไม่เป็นจริง
Giorgio
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.