C ++ 14, C ++ 'ya yeni anahtar sözcükler ekliyor mu?


103

C ++ Standartları Komitesi dile yeni anahtar kelimeler eklemekten çekinme eğilimindedir, ancak C ++ 11 ile durum böyle değildi. Bazı örnekler:

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

C ++ 14 ile sunulan yeni anahtar kelimeler var mı?

Yanıtlar:


135

N3936'daki (C ++ 14) Tablo 4 (Anahtar Kelimeler):

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

N3337'deki Tablo 4 (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

... bu "hayır" demenin uzun soluklu bir yolu.

( overrideve final"özel anlamı olan tanımlayıcılardır" ve Tablo 3'te listelenmiştir; andvb. "belirli operatörler ve noktalama işaretleri için alternatif temsillerdir" ve Tablo 5'te listelenmiştir. C ++ 11 ve C ++ arasında tablo değişmedi 14.)


2
Bunun her çeviri biriminin küresel ad alanına konulmaları olduğunu söyleyebilirim. (Evet, neden olduğunu sorabilirsiniz ve sonra iyi ...)
R.Martinho Fernandes

2
registerAnahtar kelime hala yararlı mı yoksa yeni C ++ 11 kodunda mı kullanılıyor?
Walter

2
@Walter Kullanımdan kaldırıldı ve yine de derleyiciler tarafından büyük ölçüde göz ardı edildi.
TC

1
Alternatif belirteçleri mantıksal operatörler için olan tablolarda belirtilen değildir? C ++ anahtar kelimeleri değiller mi?
Nikos Athanasiou

1
@NikosAthanasiou, Bu IIRC'nin altında olanlar için bir tablo var.
chris

85

Bu yanıtı, benzer sorulara yanıt bulmaya yönelik araçlar sağlamak adına gönderiyorum.

Standart taslak şu anda herkese açık bir GitHub deposunda tutulmaktadır. Bu, bu soruyu GitHub'a sorabileceğiniz anlamına gelir!

Anahtar kelime tablosu dosyadadır source/lex.tex. Bir suçlama yaparsanız , anahtar kelimeler tablosundaki son değişikliğin Ağustos 2011'de gerçekleştiğini görebiliriz (aslında bu ilk işlemdir: repo C ++ 11 civarında yayınlandıktan sonra bu tablo değişmemiştir. sonuçlandırılıyordu).

Alternatif olarak GitHub'dan standardın her iki versiyonu için oy pusulası için gönderilen iki taslağı karşılaştırmasını isteyebiliriz: N3337 ve N3936. Bir bu iki arasındaki fark değişiklikleri bu gösterileri lex.texdeğil Anahtar kelimeler tablosunda değişiklik şey yapmadı.


1
Bunun için teşekkürler! Görünüşe göre bugün itibariyle hala bir değişiklik yok.
sbi

34

C ++ 14 ile hiçbir yeni anahtar kelime eklenmeyecektir. Bu şaşırtıcı değildir, çünkü C ++ 14 temel olarak hataları temizleme ve küçük, düşük etkili iyileştirmeler yapma ile ilgili C ++ 11'e küçük bir yükseltme olarak tasarlanmıştır. Bir sonraki büyük değişiklik büyük olasılıkla C ++ '17' olacak ve burada bir kez daha yeni anahtar kelimeler bekleyeceğim.

C ++ Standartları Komitesi dile yeni anahtar kelimeler eklemekten çekinme eğilimindedir, ancak C ++ 11 ile durum böyle değildi.

Komitenin neden yeni anahtar kelimeler eklemekten kaçındığını (ve tesadüfen neden autolistenize dahil etmekte hatalı olduğunuzu) düşünmeye değer olduğunu düşünüyorum . Yeni anahtar kelimelerle ilgili temel sorun, C ++ 'da bir anahtar kelimeyi tanımlayıcı olarak kullanamamanızdır; bu, yeni bir anahtar kelime eklemenin mevcut kodu bozduğu anlamına gelir. Öyleyse yeniden kullanım auto, kurallarını ihlal etmez çünkü mevcut hiçbir kod zatenauto bir tanımlayıcı olarak kullanılamaz .

Dolayısıyla, yeni bir anahtar kelimeyi kabul etmek için, mevcut kodla olası bir çatışmanın maliyetinden daha ağır basan bir gerekçe olması ve aynı şeyi yeni bir anahtar kelime olmadan uygulamanın mantıklı bir yolu olmaması gerekir. C ++ 11 durumunda komite, yeni anahtar kelimeler eklemekten nefret etmedikleri için değil, faydanın maliyetten ağır bastığını düşündükleri için yeni anahtar kelimeler gerektiren birkaç teklifi kabul etti.

Ayrıca, verdiğiniz listeye bakarsanız, her birinin bir bileşik anahtar kelimesi olmasının nedeni de budur, çünkü bu, mevcut tanımlayıcılarla çakışmaları olasılığını azaltır.


1
"C ++ '17' burada bir kez daha yeni anahtar kelimeler bekleyeceğim.": C ++ sonunda büyümeyi durduracak mı?
Giorgio

2
@Giorgio Yazılım ve donanım sonunda gelişmeyi bırakacak mı? Buradaki büyük ikilem, cesur bir karar alıp "eski" sözdizimini bir kenara atıp atıp, eski kodu kırıp sadece dilin gelişmiş kısmıyla devam edip edemeyeceğinizdir. Python bunu yapmaya çalışıyor
Lorah Attkins

2
@NorahAttkins: Açıkça yazılım gelişmelidir, ancak bir dili süresiz olarak büyütmek tek çözüm değildir: bir dil belirli bir niş için olgunlaştığında, her zaman uyumluluğu kırabilir ve yeni nişlerin ihtiyaçlarını karşılamak için yeni bir dil başlatabilirsiniz. Python bir örnektir. Diğer örnekler şunlardır: C ++ -> Java, Java -> Scala, Common Lisp -> Clojure, C ++ -> D. Bazı diller süresiz olarak büyür çünkü toplulukları en sevdikleri dilin tek gerçek dil olduğuna ve onu istediklerine inanır. olası tüm uygulama alanları için uygun olacak. Elbette bu beklenti gerçekçi değil.
Giorgio
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.