Czy C ++ 14 dodaje nowe słowa kluczowe do C ++?

103

Komitet Standardów C ++ ma tendencję do unikania dodawania nowych słów kluczowych do języka, jednak w przypadku C ++ 11 tak nie było. Kilka przykładów:

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

Czy w C ++ 14 wprowadzono jakieś nowe słowa kluczowe?

Nikos Athanasiou
źródło

Odpowiedzi:

135

Tabela 4 (słowa kluczowe) w 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

Tabela 4 w 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

... co jest rozwlekłym sposobem na powiedzenie „nie”.

( overridei finalsą „identyfikatorami o specjalnym znaczeniu” i są wymienione w tabeli 3; anditd. są „alternatywnymi reprezentacjami ... dla niektórych operatorów i znaków interpunkcyjnych” i są wymienione w tabeli 5. Żadna tabela nie została zmieniona między C ++ 11 a C ++ 14.)

TC
źródło
2
Powiedziałbym, że dzieje się tak dlatego, że są one umieszczone w globalnej przestrzeni nazw każdej jednostki tłumaczeniowej. (Tak, możesz zapytać, dlaczego tak jest, a potem cóż ...)
R.Martinho Fernandes
2
Czy registersłowo kluczowe jest nadal przydatne lub używane w nowym kodzie C ++ 11?
Walter
2
@Walter I tak jest przestarzały i powszechnie ignorowany przez kompilatory.
TC,
1
Te alternatywne żetony dla operatorów logicznych nie są wymienione w tych tabelach? Czy nie są to słowa kluczowe w C ++?
Nikos Athanasiou
1
@NikosAthanasiou, pod tym IIRC znajduje się stolik dla tych.
chris
85

Publikuję tę odpowiedź, aby dać narzędzia do znajdowania odpowiedzi na podobne pytania.

Standardowa wersja robocza jest obecnie przechowywana w publicznym repozytorium GitHub. Oznacza to, że możesz zadać to pytanie samemu GitHubowi!

Tabela słów kluczowych znajduje się w pliku source/lex.tex. Jeśli obwiniasz to, możemy stwierdzić, że ostatnia zmiana w tabeli słów kluczowych miała miejsce w sierpniu 2011 (w rzeczywistości jest to pierwsze zatwierdzenie: ta tabela nie zmieniła się od czasu, gdy repozytorium zostało uruchomione w C ++ 11) był finalizowany).

Alternatywnie możemy poprosić GitHub o porównanie dwóch projektów, które zostały przesłane do głosowania dla obu wersji standardu: N3337 i N3936. Diff między tymi dwoma pokazuje, że zmiany lex.texnie zmienił niczego w tabeli słów kluczowych.

R. Martinho Fernandes
źródło
1
Dzięki za to! Wygląda na to, że do dzisiaj nie było żadnych zmian.
sbi
34

Żadne nowe słowa kluczowe nie zostaną dodane w C ++ 14. Nie jest to zaskakujące, ponieważ C ++ 14 jest pomyślane jako niewielkie uaktualnienie do C ++ 11, głównie związane z usuwaniem błędów i wprowadzaniem niewielkich ulepszeń o niewielkim wpływie. Następną dużą zmianą będzie prawdopodobnie C ++ „17”, w którym ponownie oczekiwałbym nowych słów kluczowych.

Komitet Standardów C ++ ma tendencję do unikania dodawania nowych słów kluczowych do języka, jednak w przypadku C ++ 11 tak nie było.

Myślę, że warto zastanowić się, dlaczego komitet wzbrania się przed dodawaniem nowych słów kluczowych (i przypadkowo, dlaczego nie masz racji umieszczając je autona swojej liście). Głównym problemem związanym z nowymi słowami kluczowymi jest to, że w C ++ nie można użyć słowa kluczowego jako identyfikatora, co oznacza, że ​​dodanie nowego słowa kluczowego zepsuje istniejący kod. Zmiana przeznaczenia auto, a następnie, nie łamie swoje reguły, ponieważ żaden istniejący kod może użyć autojako identyfikator anyway .

Tak więc, aby zaakceptować nowe słowo kluczowe, musi istnieć uzasadnienie, które przewyższa koszt potencjalnego kolizji z istniejącym kodem i nie ma sensownego sposobu implementacji tego samego bez nowego słowa kluczowego. W przypadku C ++ 11 komisja zaakceptowała kilka propozycji, które wymagały nowych słów kluczowych, ponieważ uważali, że korzyści przeważają nad kosztami, a nie dlatego, że nie lubią dodawać nowych słów kluczowych.

Dlatego jeśli spojrzysz na podaną listę, każde z nich jest złożonym słowem kluczowym, ponieważ zmniejsza to prawdopodobieństwo, że będą kolidować z istniejącymi identyfikatorami.

Jack Aidley
źródło
1
„C ++ '17', gdzie oczekiwałbym nowych słów kluczowych.”: Czy C ++ w końcu przestanie się rozwijać?
Giorgio,
2
@Giorgio Czy oprogramowanie i sprzęt w końcu przestaną ewoluować? Tutaj duży dylemat dotyczy tego, czy można podjąć odważną decyzję i wyrzucić „starą” składnię, złamać stary kod i kontynuować pracę tylko z rozwiniętą częścią języka. Python trochę próbuje to zrobić
Lorah Attkins
2
@NorahAttkins: Oczywiście oprogramowanie musi ewoluować, ale rozwijanie języka w nieskończoność nie jest jedynym rozwiązaniem: kiedy język jest dojrzały do ​​określonej niszy, zawsze można przełamać kompatybilność i rozpocząć nowy język, aby zaspokoić potrzeby nowych nisz. Python jest jednym z przykładów. Inne przykłady to C ++ -> Java, Java -> Scala, Common Lisp -> Clojure, C ++ -> D. Niektóre języki rosną w nieskończoność, ponieważ ich społeczność jest przekonana, że ​​ich ulubiony język jest jedynym prawdziwym językiem i tego chcą do wszystkich możliwych obszarów zastosowań. Oczywiście to oczekiwanie nie jest realistyczne.
Giorgio