C++標準委員会は、言語に新しいキーワードを追加することをためらう傾向がありますが、C++ 11ではそうではありませんでした。いくつかの例:
constexpr
decltype
thread_local
auto // New usage
noexcept
nullptr
static_assert
alignof
alignas
C++ 14で導入された新しいキーワードはありますか?
N3936(C++ 14)の表4(キーワード):
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
N3337の表4(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の間で変更されていません。)
同様の質問に対する回答を見つけるためのツールを提供するために、この回答を投稿しています。
標準ドラフトは現在、パブリックGitHubリポジトリに保持されています。つまり、GitHub自体にこの質問をすることができます!
キーワードテーブルはファイルsource/Lex.tex
にあります。それを責めれば、2011年8月に キーワードテーブルへの最後の変更 が行われたことがわかります(実際には最初のコミットです:リポジトリが公開されて以来、そのテーブルは変更されていません) C++ 11が完成する頃)。
または、GitHubに、N3337とN3936の両方のバージョンの投票のために送られた2つのドラフトを比較するよう依頼することができます。 これら2つの間の差分 は、Lex.tex
への変更がキーワードテーブルの何も変更しなかったことを示します。
C++ 14では新しいキーワードは追加されません。これは当然のことです。C++ 14は、主にバグのクリーンアップと小さな、影響の少ない改善を行うためのC++ 11への小さなアップグレードを目的としているためです。次の大きな変更はC++ '17'である可能性が高く、新しいキーワードが再び予想されます。
C++標準委員会は、言語に新しいキーワードを追加することをためらう傾向がありますが、C++ 11ではそうではありませんでした。
why委員会は新しいキーワードの追加を避けています(そして、偶然にもauto
をリストに含めるのが間違っている理由)。新しいキーワードの主な問題は、C++ではキーワードを識別子として使用できないことです。これは、新しいキーワードを追加すると既存のコードが破損することを意味します。 auto
を再目的化しても、既存のコードではauto
を識別子として使用できないため、規則は破られませんとにかく。
そのため、新しいキーワードを受け入れるには、既存のコードとの潜在的な衝突のコストを上回る正当化が必要であり、新しいキーワードなしで同じことを実装する賢明な方法はありません。 C++ 11の場合、委員会は、新しいキーワードを追加することを嫌わないためではなく、利益がコストを上回ると感じたため、新しいキーワードを必要とするいくつかの提案を受け入れました。
また、指定したリストを下に見た場合、それぞれがcompoundキーワードである理由は、既存の識別子と衝突する可能性を減らすためです。