web-dev-qa-db-fra.com

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

Le C++ Standards Committee 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?

103
Nikos Athanasiou

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

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

(override et final sont des "identificateurs ayant une signification spéciale" et sont répertoriés dans le tableau 3; and etc. sont des "représentations alternatives ... pour certains opérateurs et ponctuateurs" et sont répertoriés dans le tableau 5. Aucune des deux tables n'a changé entre C++ 11 et C++ 14.)

136
T.C.

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

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

Le tableau des mots-clés se trouve dans le fichier source/Lex.tex. Si vous en êtes responsable, nous pouvons constater que le dernière modification de 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 ligne du référentiel à l'époque où C++ 11 était en cours de finalisation).

Alternativement, nous pouvons demander à GitHub de comparer les deux projets qui ont été envoyés au scrutin pour les deux versions de la norme: N3337 et N3936. Un diff entre ces deux montre que les changements de Lex.tex n'a rien changé dans le tableau des mots clés.

85

Aucun nouveau mot clé ne sera ajouté avec C++ 14. Ce 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 l'amélioration de faible impact. Le prochain changement majeur est probablement le C++ '17' où je m'attendrais à nouveau à de nouveaux mots clés.

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

Je pense que cela vaut la peine d'envisager pourquoi le comité hésite à ajouter de nouveaux mots clés (et coïncident pourquoi vous avez tort d'inclure auto sur 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 identifiant, ce qui signifie que l'ajout d'un nouveau mot clé rompt le code existant. La réutilisation de auto ne déroge donc pas à leur règle car aucun code existant ne peut utiliser auto comme identifiant de toute façon.

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 sensé de mettre en œuvre la même chose sans un nouveau mot clé. Dans le cas de 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 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 qu'ils se heurtent aux identifiants existants.

33
Jack Aidley