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”.
( override
i final
są „identyfikatorami o specjalnym znaczeniu” i są wymienione w tabeli 3; and
itd. 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.)
register
słowo kluczowe jest nadal przydatne lub używane w nowym kodzie C ++ 11?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.tex
nie zmienił niczego w tabeli słów kluczowych.źródło
Ż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.
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
auto
na 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 przeznaczeniaauto
, a następnie, nie łamie swoje reguły, ponieważ żaden istniejący kod może użyćauto
jako 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.
źródło