Является ли С++ 14 добавлением новых ключевых слов в С++?

Комитет по стандартам С++ стремится уклониться от добавления новых ключевых слов на язык, но с С++ 11 это не так. Некоторые примеры:

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

Есть ли новые ключевые слова с С++ 14?

Ответ 1

Таблица 4 (Ключевые слова) в N3936 (С++ 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

Таблица 4 в N3337 (С++ 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

... который является длинным способом сказать "нет".

(override и final являются "идентификаторами со специальным значением" и перечислены в таблице 3; and и т.д. являются "альтернативными представлениями... для определенных операторов и пунктуаторов" и перечислены в таблице 5. Ни одна таблица не изменилась между С++ 11 и С++ 14.)

Ответ 2

Я отправляю этот ответ ради предоставления инструментов для поиска ответов на похожие вопросы.

Стандартный проект в настоящее время хранится в публичном репозитории GitHub. Это означает, что вы можете задать этот вопрос самому GitHub!

Таблица ключевых слов находится в файле source/lex.tex. Если вы обвиняете его, мы можем обнаружить, что последнее изменение в таблице ключевых слов произошло еще в августе 2011 года (это фактически первая фиксация: эта таблица не изменилась с тех пор, как репо перешло в тупик, когда завершался С++ 11).

В качестве альтернативы мы можем попросить GitHub сравнить два черновика, которые были отправлены для голосования для обеих версий стандарта: N3337 и N3936. A diff между этими двумя показывает, что изменения в lex.tex ничего не изменили в таблице ключевых слов.

Ответ 3

Никакие новые ключевые слова не будут добавлены с С++ 14. Это неудивительно, так как С++ 14 предназначен для небольшого обновления до С++ 11, который в основном занимается очисткой ошибок и небольшим, низким воздействием, улучшением. Следующим крупным изменением, вероятно, будет С++ '17', где я бы ожидал новых ключевых слов еще раз.

Комитет по стандартам С++ склонен уклоняться от добавления новых ключевых слов к языку, но с С++ 11 это не так.

Я думаю, стоит подумать, почему комитет уклоняется от добавления новых ключевых слов (и, кстати, почему вы ошибаетесь, чтобы включить auto в свой список). Основная проблема с новыми ключевыми словами заключается в том, что в С++ вы не можете использовать ключевое слово в качестве идентификатора, что означает, что добавление нового ключевого слова разбивает существующий код. Повторяя auto, тогда это не нарушает их правило, потому что ни один из существующих кодов не может использовать auto как идентификатор.

Таким образом, чтобы принять новое ключевое слово, должно быть оправдание, которое перевешивает стоимость потенциального столкновения с существующим кодом и без разумного способа реализовать одно и то же без нового ключевого слова. В случае С++ 11 комитет принял несколько предложений, требующих новых ключевых слов, поскольку они полагали, что это преимущество перевешивает стоимость не потому, что они не ненавидят добавлять новые ключевые слова.

Также, если вы посмотрите вниз по списку, который вы указали, каждый из них является составным ключевым словом, поскольку это уменьшает вероятность столкновения с существующими идентификаторами.