Fügt C ++ 14 C ++ neue Schlüsselwörter hinzu?

103

Das C ++ - Standardkomitee scheut sich, der Sprache neue Schlüsselwörter hinzuzufügen, bei C ++ 11 war dies jedoch nicht der Fall. Einige Beispiele:

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

Gibt es neue Schlüsselwörter, die mit C ++ 14 eingeführt wurden?

Nikos Athanasiou
quelle

Antworten:

135

Tabelle 4 (Schlüsselwörter) in 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

Tabelle 4 in 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

... was eine langatmige Art ist, "nein" zu sagen.

( overrideund finalsind "Bezeichner mit besonderer Bedeutung" und in Tabelle 3 aufgeführt; andusw. sind "alternative Darstellungen ... für bestimmte Operatoren und Interpunktionszeichen" und in Tabelle 5 aufgeführt. Keine der beiden Tabellen hat sich zwischen C ++ 11 und C ++ geändert 14.)

TC
quelle
2
Ich würde sagen, das liegt daran, dass sie in den globalen Namespace jeder Übersetzungseinheit eingefügt werden. (Ja, Sie können fragen, warum das so ist, und dann gut ...)
R. Martinho Fernandes
2
Ist das registerSchlüsselwort noch nützlich oder wird es in neuem C ++ 11-Code verwendet?
Walter
2
@Walter Es ist veraltet und wird von Compilern sowieso weitgehend ignoriert.
TC
1
Die alternativen Token für logische Operatoren werden in diesen Tabellen nicht erwähnt. Sind sie nicht C ++ - Schlüsselwörter?
Nikos Athanasiou
1
@ NikosAthanasiou, es gibt eine Tabelle für diejenigen direkt unter diesem einen IIRC.
Chris
85

Ich poste diese Antwort, um Tools zu finden, mit denen Sie Antworten auf ähnliche Fragen finden können.

Der Standardentwurf wird derzeit in einem öffentlichen GitHub-Repository gespeichert. Das heißt, Sie können diese Frage an GitHub selbst stellen!

Die Schlüsselworttabelle befindet sich in der Datei source/lex.tex. Wenn Sie die Schuld daran geben, können wir feststellen, dass die letzte Änderung an der Keyword-Tabelle im August 2011 stattgefunden hat (es ist tatsächlich das erste Commit: Diese Tabelle hat sich nicht geändert, seit das Repo um die Zeit von C ++ 11 live gegangen ist wurde fertiggestellt).

Alternativ können wir GitHub bitten, die beiden Entwürfe zu vergleichen, die für beide Versionen des Standards zur Abstimmung gesendet wurden: N3337 und N3936. Ein Unterschied zwischen diesen beiden zeigt, dass die Änderungen an lex.texnichts in der Schlüsselworttabelle geändert haben.

R. Martinho Fernandes
quelle
1
Danke dafür! Es sieht so aus, als ob sich bis heute noch nichts geändert hat.
sbi
34

Mit C ++ 14 werden keine neuen Schlüsselwörter hinzugefügt. Dies ist nicht überraschend, da C ++ 14 als kleines Upgrade auf C ++ 11 gedacht ist, das hauptsächlich dazu dient, Fehler zu beseitigen und kleine Verbesserungen mit geringen Auswirkungen vorzunehmen. Die nächste große Änderung wird wahrscheinlich C ++ '17' sein, wo ich wieder neue Schlüsselwörter erwarten würde.

Das C ++ - Standardkomitee scheut sich, der Sprache neue Schlüsselwörter hinzuzufügen, bei C ++ 11 war dies jedoch nicht der Fall.

Ich denke, es lohnt sich zu überlegen, warum das Komitee es scheut, neue Keywords hinzuzufügen (und zufällig, warum Sie falsch sind, autoin Ihre Liste aufzunehmen). Das Hauptproblem bei neuen Schlüsselwörtern besteht darin, dass Sie in C ++ kein Schlüsselwort als Bezeichner verwenden können. Dies bedeutet, dass das Hinzufügen eines neuen Schlüsselworts den vorhandenen Code beschädigt. Eine erneute Verwendung verstößt autoalso nicht gegen ihre Regel, da ohnehin kein vorhandener Code autoals Bezeichner verwendet werden kann .

Um ein neues Schlüsselwort zu akzeptieren, muss es eine Begründung geben, die die Kosten eines möglichen Konflikts mit vorhandenem Code überwiegt, und keine sinnvolle Möglichkeit, dasselbe ohne ein neues Schlüsselwort zu implementieren. Im Fall von C ++ 11 akzeptierte das Komitee einige Vorschläge, die neue Schlüsselwörter erforderten, da sie der Ansicht waren, dass der Nutzen die Kosten überwog, nicht weil sie es nicht hassen, neue Schlüsselwörter hinzuzufügen.

Wenn Sie sich die Liste ansehen, die Sie angegeben haben, ist jedes einzelne ein zusammengesetztes Schlüsselwort, da dies die Wahrscheinlichkeit verringert, dass sie mit vorhandenen Kennungen in Konflikt geraten.

Jack Aidley
quelle
1
"C ++ '17', wo ich wieder neue Keywords erwarten würde.": Wird C ++ irgendwann aufhören zu wachsen?
Giorgio
2
@Giorgio Werden sich Software und Hardware irgendwann nicht mehr weiterentwickeln? Das große Dilemma hier ist, ob Sie eine mutige Entscheidung treffen und "alte" Syntax wegwerfen, alten Code brechen und nur mit dem weiterentwickelten Teil der Sprache fortfahren können. Python versucht das irgendwie
Lorah Attkins
2
@NorahAttkins: Natürlich muss sich die Software weiterentwickeln, aber das unbegrenzte Wachsen einer Sprache ist nicht die einzige Lösung: Wenn eine Sprache für eine bestimmte Nische ausgereift ist, können Sie jederzeit die Kompatibilität brechen und eine neue Sprache starten, um die Anforderungen neuer Nischen zu erfüllen. Python ist ein Beispiel. Andere Beispiele sind C ++ -> Java, Java -> Scala, Common Lisp -> Clojure, C ++ -> D. Einige Sprachen wachsen auf unbestimmte Zeit, weil ihre Community davon überzeugt ist, dass ihre Lieblingssprache die einzig wahre Sprache ist und sie es wollen für alle möglichen Anwendungsbereiche geeignet sein. Diese Erwartung ist natürlich nicht realistisch.
Giorgio