Чи додає 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.)


2
Я б сказав, що це тому, що вони розміщуються в глобальному просторі імен кожного перекладацького підрозділу. (Так, ви можете запитати, чому це так, і тоді добре ...)
Р. Мартіньо Фернандес

2
Чи registerвсе ще ключове слово корисне чи використовується в новому коді C ++ 11?
Вальтер

2
@Walter Компілятори все одно застаріли і широко ігноруються.
ТК

1
В альтернативних маркерів для логічних операторів не згадуються в цих таблицях? Це не ключові слова C ++?
Нікос Афанасьоу

1
@NikosAthanasiou, Є таблиця для тих, хто знаходиться прямо під цим IIRC.
chris

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 Чи з часом програмне забезпечення та обладнання перестануть розвиватися? Велика дилема тут полягає в тому, чи можна прийняти сміливе рішення і викинути «старий» синтаксис, зламати старий код і продовжувати просто з розвиненою частиною мови. Пітон щось
подібний

2
@NorahAttkins: Зрозуміло, що програмне забезпечення повинно розвиватися, але зростання мови нескінченно не є єдиним рішенням: коли мова дозріла для певної ніші, ви завжди можете порушити сумісність і запустити нову мову, щоб задовольнити потреби нових ніш. Python - один із прикладів. Інші приклади - C ++ -> Java, Java -> Scala, Common Lisp -> Clojure, C ++ -> D. Деякі мови ростуть нескінченно, оскільки їх громада переконана, що їх улюблена мова є єдиною справжньою мовою, і вони хочуть цього підходить для всіх можливих областей застосування. Звичайно, це очікування не є реалістичним.
Джорджіо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.