web-dev-qa-db-ja.com

C ++ 14はC ++に新しいキーワードを追加しますか?

C++標準委員会は、言語に新しいキーワードを追加することをためらう傾向がありますが、C++ 11ではそうではありませんでした。いくつかの例:

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

C++ 14で導入された新しいキーワードはありますか?

103

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

...これは、「いいえ」という長い言い方です。

overridefinalは「特別な意味を持つ識別子」であり、表3にリストされています。andなどは「特定の演算子と句読点の代替表現」と表5にリストされています。どちらの表もC++ 11とC++ 14の間で変更されていません。)

136
T.C.

同様の質問に対する回答を見つけるためのツールを提供するために、この回答を投稿しています。

標準ドラフトは現在、パブリックGitHubリポジトリに保持されています。つまり、GitHub自体にこの質問をすることができます!

キーワードテーブルはファイルsource/Lex.texにあります。それを責めれば、2011年8月に キーワードテーブルへの最後の変更 が行われたことがわかります(実際には最初のコミットです:リポジトリが公開されて以来、そのテーブルは変更されていません) C++ 11が完成する頃)。

または、GitHubに、N3337とN3936の両方のバージョンの投票のために送られた2つのドラフトを比較するよう依頼することができます。 これら2つの間の差分 は、Lex.texへの変更がキーワードテーブルの何も変更しなかったことを示します。

85

C++ 14では新しいキーワードは追加されません。これは当然のことです。C++ 14は、主にバグのクリーンアップと小さな、影響の少ない改善を行うためのC++ 11への小さなアップグレードを目的としているためです。次の大きな変更はC++ '17'である可能性が高く、新しいキーワードが再び予想されます。

C++標準委員会は、言語に新しいキーワードを追加することをためらう傾向がありますが、C++ 11ではそうではありませんでした。

why委員会は新しいキーワードの追加を避けています(そして、偶然にもautoをリストに含めるのが間違っている理由)。新しいキーワードの主な問題は、C++ではキーワードを識別子として使用できないことです。これは、新しいキーワードを追加すると既存のコードが破損することを意味します。 autoを再目的化しても、既存のコードではautoを識別子として使用できないため、規則は破られませんとにかく

そのため、新しいキーワードを受け入れるには、既存のコードとの潜在的な衝突のコストを上回る正当化が必要であり、新しいキーワードなしで同じことを実装する賢明な方法はありません。 C++ 11の場合、委員会は、新しいキーワードを追加することを嫌わないためではなく、利益がコストを上回ると感じたため、新しいキーワードを必要とするいくつかの提案を受け入れました。

また、指定したリストを下に見た場合、それぞれがcompoundキーワードである理由は、既存の識別子と衝突する可能性を減らすためです。

33
Jack Aidley