C ++ 14 ajoute-t-il de nouveaux mots-clés au C ++?

103

Le Comité des normes C ++ a tendance à hésiter à ajouter de nouveaux mots-clés au langage, mais avec C ++ 11, ce n'était pas le cas. Quelques exemples:

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

Y a-t-il de nouveaux mots clés introduits avec C ++ 14?

Nikos Athanasiou
la source

Réponses:

135

Tableau 4 (Mots clés) dans 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

Tableau 4 dans 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

... ce qui est une longue façon de dire "non".

( overrideet finalsont des «identificateurs avec une signification spéciale» et sont répertoriés dans le tableau 3; andetc. sont des «représentations alternatives ... pour certains opérateurs et ponctuateurs» et sont répertoriés dans le tableau 5. Aucune des tables n'a été modifiée entre C ++ 11 et C ++ 14.)

TC
la source
2
Je dirais que c'est parce qu'ils sont placés dans l'espace de noms global de chaque unité de traduction. (Ouais, vous pouvez demander pourquoi, et puis bien ...)
R. Martinho Fernandes
2
Le registermot clé est-il toujours utile ou utilisé dans le nouveau code C ++ 11?
Walter
2
@Walter Il est de toute façon obsolète et largement ignoré par les compilateurs.
TC
1
Les jetons alternatifs pour les opérateurs logiques ne sont pas mentionnés dans ces tableaux? Ne sont-ils pas des mots-clés C ++?
Nikos Athanasiou
1
@NikosAthanasiou, Il y a une table pour ceux juste sous celui-ci IIRC.
chris
85

Je poste cette réponse dans le but de donner des outils pour trouver des réponses à des questions similaires.

Le projet standard est actuellement conservé dans un référentiel GitHub public. Cela signifie que vous pouvez poser cette question à GitHub lui-même!

La table des mots-clés se trouve dans le fichier source/lex.tex. Si vous le blâmez, nous pouvons constater que la dernière modification apportée à la table des mots clés a eu lieu en août 2011 (c'est en fait le premier commit: cette table n'a pas changé depuis la mise en service du dépôt à l'époque C ++ 11 était en cours de finalisation).

Alternativement, nous pouvons demander à GitHub de comparer les deux projets envoyés au scrutin pour les deux versions de la norme: N3337 et N3936. Une différence entre les deux montre que les modifications apportées à lex.texn'ont rien changé dans le tableau des mots-clés.

R. Martinho Fernandes
la source
1
Merci pour cela! Il semble qu'il n'y ait toujours eu aucun changement à ce jour.
sbi
34

Aucun nouveau mot-clé ne sera ajouté avec C ++ 14. Cela n'est pas surprenant car C ++ 14 est conçu comme une petite mise à niveau vers C ++ 11 principalement impliquée dans le nettoyage des bogues et dans la réalisation de petites améliorations à faible impact. Le prochain changement majeur sera probablement C ++ '17' où je m'attendrais à nouveau à de nouveaux mots clés.

Le Comité des normes C ++ a tendance à hésiter à ajouter de nouveaux mots-clés au langage, mais avec C ++ 11, ce n'était pas le cas.

Je pense qu'il vaut la peine de se demander pourquoi le comité évite d'ajouter de nouveaux mots clés (et, par ailleurs, pourquoi vous avez tort d'inclure autosur votre liste). Le principal problème avec les nouveaux mots clés est qu'en C ++, vous ne pouvez pas utiliser un mot clé comme identificateur, ce qui signifie que l'ajout d'un nouveau mot clé rompt le code existant. La réutilisation ne viole autodonc pas leur règle car aucun code existant ne peut autode toute façon être utilisé comme identifiant .

Donc, pour accepter un nouveau mot-clé, il doit y avoir une justification qui l'emporte sur le coût d'un conflit potentiel avec le code existant et aucun moyen raisonnable d'implémenter la même chose sans nouveau mot-clé. Dans le cas du C ++ 11, le comité a accepté quelques propositions qui nécessitaient de nouveaux mots clés car ils estimaient que l'avantage l'emportait sur le coût, non pas parce qu'ils ne détestaient pas ajouter de nouveaux mots clés.

C'est aussi pourquoi, si vous regardez la liste que vous avez donnée, chacun est un mot-clé composé car cela réduit le risque de conflit avec les identifiants existants.

Jack Aidley
la source
1
"C ++ '17' où je m'attendrais une fois de plus à de nouveaux mots clés.": C ++ finira-t-il par s'arrêter de croître?
Giorgio
2
@Giorgio Les logiciels et le matériel cesseront-ils finalement d'évoluer? Le grand dilemme ici est de savoir si vous pouvez prendre une décision audacieuse et jeter la «vieille» syntaxe, casser l'ancien code et continuer uniquement avec la partie évoluée du langage. Python essaie un peu de le faire
Lorah Attkins
2
@NorahAttkins: Il est clair que les logiciels doivent évoluer, mais faire croître une langue indéfiniment n'est pas la seule solution: quand une langue est mature pour un certain créneau, vous pouvez toujours rompre la compatibilité et commencer une nouvelle langue pour satisfaire les besoins de nouvelles niches. Python en est un exemple. D'autres exemples sont C ++ -> Java, Java -> Scala, Common Lisp -> Clojure, C ++ -> D.Certains langages se développent indéfiniment parce que leur communauté est convaincue que leur langage préféré est le seul vrai langage et ils le veulent pour être adapté à tous les domaines d'application possibles. Bien sûr, cette attente n'est pas réaliste.
Giorgio