Warum ist die Initialisierung von Enum-Klassen-Provisorien mit beliebigen Werten erlaubt?

8

Ich stieß in einem der CppCon 2014-Gespräche auf einen Code wie den folgenden, der mich völlig durcheinander brachte. Das Publikum akzeptierte es ohne Kommentar, also vermute ich, dass es legal ist:

%Vor%

Die Frage ist: Warum kompiliert das? Ich würde erwarten, dass die Kompilierung fehlschlägt und sich beschweren, dass wir einen int nicht in einen Foo umwandeln können. Die leicht modifizierte Zeile unten schlägt mit dem erwarteten Fehler fehl:

%Vor%     
Peter Ruderman 15.06.2015, 18:55
quelle

1 Antwort

9

Begrenzte Aufzählungstypen haben einen impliziten zugrunde liegenden Typ von int , vorausgesetzt, es wurde kein anderer zugrunde liegender Typ angegeben. Alle möglichen Werte vom Typ int können dargestellt werden.

7.2p5:

  

[...] Bei einem Aufzählungstyp mit Bereichsangabe ist der zugrunde liegende Typ int , wenn er nicht explizit angegeben wird. In beiden Fällen der zugrunde liegende Typ   soll behoben sein. [...]

7.2p8:

  

Bei einer Enumeration, deren zugrunde liegender Typ festgelegt ist, sind die Werte der Enumeration die Werte des zugrunde liegenden Typs. [...]

Und jeder ganzzahlige Wert, der durch die Enumeration dargestellt werden kann, kann explizit in diesen Enumerationstyp konvertiert werden, wie @Columbo in seiner jetzt gelöschten Antwort darauf hingewiesen hat:

5.2.9p10:

  

Ein Integral- oder Enumerationstyp kann explizit in einen Aufzählungstyp konvertiert werden. Der Wert ist unverändert, wenn der ursprüngliche Wert im Bereich der Aufzählungswerte (7.2) liegt. [...]

Da gibt es einige Verwirrung in den Kommentaren darüber, was das bedeutet:

%Vor%

ist klar definiert. Nicht definiert, nicht spezifiziert, nicht einmal implementierungsdefiniert. Die Teile des Standards, die ich zitiere, erklären das:

  1. Der zugrunde liegende Typ von Foo ist int und der zugrunde liegende Typ ist fest.
  2. Die Werte von Foo sind die Werte von int .
  3. Da 5 im Bereich der Aufzählungswerte liegt, ist der Wert bei der Konvertierung unverändert.
hvd 15.06.2015, 19:13
quelle

Tags und Links