C ++ 14 có thêm từ khóa mới vào C ++ không?


103

Ủy ban Tiêu chuẩn C ++ có xu hướng tránh thêm các từ khóa mới vào ngôn ngữ này, nhưng với C ++ 11 thì không như vậy. Vài ví dụ:

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

Có bất kỳ từ khóa mới nào được giới thiệu với C ++ 14 không?

Câu trả lời:


135

Bảng 4 (Từ khóa) trong 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

Bảng 4 trong 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

... đó là một cách nói "không" dài dòng.

( overridefinallà "số nhận dạng có ý nghĩa đặc biệt" và được liệt kê trong Bảng 3; andv.v. là "đại diện thay thế ... cho một số toán tử và dấu chấm câu" và được liệt kê trong Bảng 5. Cả hai bảng đều không thay đổi giữa C ++ 11 và C ++ 14.)


2
Tôi muốn nói rằng đó là vì chúng được đặt trong không gian tên chung của mọi đơn vị dịch. (Vâng, bạn có thể hỏi tại sao có nghĩa là, và sau đó cũng ...)
R. Martinho Fernandes

2
registertừ khóa vẫn còn có ích hoặc sử dụng trong C ++ mới 11 mã?
Walter

2
@Walter Dù sao thì nó cũng không được chấp nhận và bị bỏ qua rộng rãi bởi các trình biên dịch.
TC

1
Các mã thông báo thay thế cho các toán tử logic không được đề cập trong các bảng đó? Chúng không phải là từ khóa C ++?
Nikos Athanasiou

1
@NikosAthanasiou, Có một bảng cho những người ngay dưới IIRC này.
chris

85

Tôi đăng câu trả lời này với mục đích cung cấp các công cụ để tìm câu trả lời cho các câu hỏi tương tự.

Bản nháp tiêu chuẩn hiện được lưu giữ trong kho lưu trữ GitHub công khai. Điều đó có nghĩa là bạn có thể đặt câu hỏi này cho chính GitHub!

Bảng từ khóa có trong tệp source/lex.tex. Nếu bạn đổ lỗi cho nó, chúng tôi có thể thấy rằng thay đổi cuối cùng đối với bảng từ khóa đã diễn ra vào tháng 8 năm 2011 (thực sự đó là cam kết đầu tiên: bảng đó đã không thay đổi kể từ khi repo được phát hành vào khoảng thời gian C ++ 11 đang được hoàn thiện).

Ngoài ra, chúng ta có thể yêu cầu GitHub so sánh hai bản nháp đã được gửi để bỏ phiếu cho cả hai phiên bản của tiêu chuẩn: N3337 và N3936. Sự khác biệt giữa hai điều đó cho thấy rằng các thay đổi đối với lex.texkhông thay đổi bất kỳ điều gì trong bảng từ khóa.


1
Cảm ơn vì điều đó! Có vẻ như vẫn không có thay đổi nào cho đến ngày hôm nay.
sbi

34

Không có từ khóa mới nào sẽ được thêm vào với C ++ 14. Điều này không có gì đáng ngạc nhiên vì C ++ 14 được dự định là một bản nâng cấp nhỏ cho C ++ 11 chủ yếu liên quan đến việc dọn dẹp lỗi và thực hiện các cải tiến nhỏ, tác động thấp. Thay đổi lớn tiếp theo có thể là C ++ '17', nơi tôi mong đợi các từ khóa mới một lần nữa.

Ủy ban Tiêu chuẩn C ++ có xu hướng tránh thêm các từ khóa mới vào ngôn ngữ này, nhưng với C ++ 11 thì không như vậy.

Tôi nghĩ rằng điều đáng xem là tại sao ủy ban lại tránh thêm các từ khóa mới (và tình cờ là tại sao bạn lại sai khi đưa autovào danh sách của mình). Vấn đề chính với các từ khóa mới là trong C ++, bạn không thể sử dụng một từ khóa làm định danh, có nghĩa là việc thêm một từ khóa mới sẽ phá vỡ mã hiện có. Repurposing auto, sau đó, không phá vỡ quy tắc của họ, vì không có mã hiện tại có thể sử dụng autonhư một định danh nào .

Vì vậy, để chấp nhận một từ khóa mới, cần phải có sự biện minh lớn hơn chi phí của một cuộc đụng độ tiềm năng với mã hiện tại và không có cách hợp lý nào để triển khai điều tương tự mà không có từ khóa mới. Trong trường hợp của C ++ 11, ủy ban đã chấp nhận một số đề xuất yêu cầu từ khóa mới vì họ cảm thấy rằng lợi ích lớn hơn chi phí không phải vì họ không ghét thêm từ khóa mới.

Đó cũng là lý do tại sao, nếu bạn nhìn xuống danh sách bạn đã cung cấp, mỗi từ khóa là một từ khóa ghép vì điều đó làm giảm khả năng chúng xung đột với các số nhận dạng hiện có.


1
"C ++ '17' nơi tôi mong đợi các từ khóa mới một lần nữa.": Cuối cùng thì C ++ có ngừng phát triển không?
Giorgio

2
@Giorgio Liệu cuối cùng phần mềm và phần cứng có ngừng phát triển không? Vấn đề nan giải lớn ở đây là liệu bạn có thể thực hiện một quyết định táo bạo và vứt bỏ cú pháp "cũ", phá vỡ mã cũ và tiếp tục chỉ với phần đã phát triển của ngôn ngữ hay không. Python kinda cố gắng để làm điều đó
Lorah Attkins

2
@NorahAttkins: Rõ ràng là phần mềm phải phát triển, nhưng phát triển một ngôn ngữ vô thời hạn không phải là giải pháp duy nhất: khi một ngôn ngữ đã trưởng thành cho một ngách nhất định, bạn luôn có thể phá vỡ khả năng tương thích và bắt đầu một ngôn ngữ mới để đáp ứng nhu cầu của các ngách mới. Python là một ví dụ. Các ví dụ khác là C ++ -> Java, Java -> Scala, Common Lisp -> Clojure, C ++ -> D. Một số ngôn ngữ phát triển vô thời hạn vì cộng đồng của họ tin rằng ngôn ngữ yêu thích của họ là ngôn ngữ thực duy nhất và họ muốn nó phù hợp cho tất cả các lĩnh vực ứng dụng có thể. Tất nhiên, kỳ vọng này không thực tế.
Giorgio
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.