Добавляет ли C ++ 14 новые ключевые слова в C ++?

103

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

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

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

Никос Афанасиу
источник

Ответы:

135

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

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

... это длинный способ сказать "нет".

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

TC
источник
2
Я бы сказал, что это потому, что они помещены в глобальное пространство имен каждой единицы перевода. (Да, вы можете спросить, почему это так, и тогда хорошо ...)
Р. Мартиньо Фернандес
2
Является ли registerключевое слово еще полезно или использовать в новом C ++ 11 кода?
Уолтер
2
@Walter В любом случае он устарел и широко игнорируется компиляторами.
TC
1
В альтернативных маркеров для логических операторов не упоминаются в этих таблицах? Разве это не ключевые слова C ++?
Никос Афанасиу
1
@NikosAthanasiou, есть таблица для тех, кто прямо под этим IIRC.
Крис
85

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

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

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

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

Р. Мартиньо Фернандес
источник
1
Спасибо за это! Похоже, на сегодня никаких изменений не произошло.
sbi
34

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

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

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

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

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

Джек Эйдли
источник
1
«C ++ '17', где я снова ожидал бы новых ключевых слов»: перестанет ли C ++ в конечном итоге развиваться?
Джорджио
2
@Giorgio Перестанут ли со временем развиваться программное и аппаратное обеспечение? Большая дилемма здесь заключается в том, можете ли вы принять смелое решение и выбросить «старый» синтаксис, сломать старый код и продолжить работу только с развитой частью языка. Python вроде как пытается это сделать
Лора Атткинс
2
@NorahAttkins: Очевидно, что программное обеспечение должно развиваться, но неограниченное развитие языка - не единственное решение: когда язык созревает для определенной ниши, вы всегда можете нарушить совместимость и начать новый язык, чтобы удовлетворить потребности новых ниш. Python - один из примеров. Другими примерами являются C ++ -> Java, Java -> Scala, Common Lisp -> Clojure, C ++ -> D. Некоторые языки растут бесконечно, потому что их сообщество убеждено, что их любимый язык - единственный настоящий язык, и они этого хотят. подходить для всех возможных областей применения. Конечно, это ожидание нереально.
Джорджио