Apakah C ++ 14 menambahkan kata kunci baru ke C ++?

103

Komite Standar C ++ cenderung menghindar dari menambahkan kata kunci baru ke bahasa tersebut, namun dengan C ++ 11 bukan itu masalahnya. Beberapa contoh:

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

Apakah ada kata kunci baru yang diperkenalkan dengan C ++ 14?

Nikos Athanasiou
sumber

Jawaban:

135

Tabel 4 (Kata Kunci) di 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

Tabel 4 di 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

... yang merupakan cara bertele-tele untuk mengatakan "tidak".

( overridedan finalmerupakan "pengidentifikasi dengan arti khusus" dan didaftar di Tabel 3; anddll. adalah "representasi alternatif ... untuk operator dan punctuator tertentu" dan tercantum dalam Tabel 5. Tidak ada tabel yang diubah antara C ++ 11 dan C ++ 14.)

TC
sumber
2
Saya akan mengatakan itu karena mereka ditempatkan di namespace global setiap unit terjemahan. (Ya, Anda dapat bertanya mengapa demikian, dan kemudian ...)
R. Martinho Fernandes
2
Apakah registerkata kunci masih berguna atau digunakan dalam kode C ++ 11 baru?
Walter
2
@Walter Ini sudah usang dan diabaikan secara luas oleh kompiler.
TC
1
The token alternatif untuk operator logika tidak disebutkan dalam tabel tersebut? Bukankah itu kata kunci C ++?
Nikos Athanasiou
1
@NikosAthanasiou, Ada meja untuk mereka di bawah IIRC yang satu ini.
chris
85

Saya memposting jawaban ini demi memberikan alat untuk menemukan jawaban atas pertanyaan serupa.

Draf standar saat ini disimpan di repositori GitHub publik. Artinya, Anda dapat mengajukan pertanyaan ini ke GitHub sendiri!

Tabel kata kunci ada di file source/lex.tex. Jika Anda melakukan kesalahan, kami dapat menemukan bahwa perubahan terakhir pada tabel kata kunci terjadi pada Agustus 2011 (sebenarnya ini adalah komit pertama: tabel itu tidak berubah sejak repo ditayangkan sekitar waktu C ++ 11 sedang diselesaikan).

Alternatifnya, kami dapat meminta GitHub untuk membandingkan dua draf yang dikirim untuk pemungutan suara untuk kedua versi standar: N3337 dan N3936. Perbedaan di antara keduanya menunjukkan bahwa perubahan ke lex.textidak mengubah apa pun dalam tabel kata kunci.

R. Martinho Fernandes
sumber
1
Terima kasih untuk ini! Sepertinya masih belum ada perubahan sampai hari ini.
sbi
34

Tidak ada kata kunci baru yang akan ditambahkan dengan C ++ 14. Ini tidak mengherankan karena C ++ 14 dimaksudkan sebagai peningkatan kecil ke C ++ 11 terutama yang terlibat dalam pembersihan bug dan membuat perbaikan kecil dan berdampak rendah. Perubahan besar berikutnya kemungkinan besar menjadi C ++ '17' di mana saya mengharapkan kata kunci baru sekali lagi.

Komite Standar C ++ cenderung menghindar dari menambahkan kata kunci baru ke bahasa tersebut, namun dengan C ++ 11 bukan itu masalahnya.

Saya pikir perlu dipertimbangkan mengapa panitia menghindar dari menambahkan kata kunci baru (dan secara kebetulan mengapa Anda salah memasukkannya ke autodalam daftar Anda). Masalah utama dengan kata kunci baru adalah bahwa di C ++ Anda tidak dapat menggunakan kata kunci sebagai pengenal yang berarti menambahkan kata kunci baru akan merusak kode yang ada. Repurposing auto, maka, tidak melanggar aturan mereka karena tidak ada kode yang ada bisa menggunakan autosebagai identifier pula .

Jadi untuk menerima kata kunci baru, perlu ada pembenaran yang melebihi biaya potensi bentrokan dengan kode yang ada dan tidak ada cara yang masuk akal untuk menerapkan hal yang sama tanpa kata kunci baru. Dalam kasus C ++ 11, panitia menerima beberapa proposal yang membutuhkan kata kunci baru karena mereka merasa manfaatnya lebih besar daripada biayanya bukan karena mereka tidak benci untuk menambahkan kata kunci baru.

Itu juga mengapa, jika Anda melihat ke bawah daftar yang Anda berikan, masing-masing adalah kata kunci gabungan karena mengurangi kemungkinan bentrok dengan pengenal yang ada.

Jack Aidley
sumber
1
"C ++ '17' di mana saya mengharapkan kata kunci baru sekali lagi.": Apakah C ++ pada akhirnya akan berhenti berkembang?
Giorgio
2
@ Giorgio Akankah perangkat lunak & perangkat keras pada akhirnya berhenti berkembang? Dilema besar di sini adalah apakah Anda dapat mengambil keputusan berani dan membuang sintaks "lama", memecahkan kode lama, dan melanjutkan hanya dengan bagian bahasa yang telah dikembangkan. Python agak mencoba melakukan itu
Lorah Attkins
2
@NorahAttkins: Jelas perangkat lunak harus berevolusi, tetapi menumbuhkan bahasa tanpa batas bukanlah satu-satunya solusi: ketika suatu bahasa sudah matang untuk ceruk tertentu, Anda selalu dapat merusak kompatibilitas dan memulai bahasa baru untuk memenuhi kebutuhan ceruk baru. Python adalah salah satu contohnya. Contoh lainnya adalah C ++ -> Java, Java -> Scala, Common Lisp -> Clojure, C ++ -> D. Beberapa bahasa tumbuh tanpa batas karena komunitas mereka yakin bahwa bahasa favorit mereka adalah satu-satunya bahasa yang benar dan mereka menginginkannya agar cocok untuk semua area aplikasi yang memungkinkan. Tentu saja harapan tersebut tidak realistis.
Giorgio