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% 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:
Foo
ist int
und der zugrunde liegende Typ ist fest. Foo
sind die Werte von int
. 5
im Bereich der Aufzählungswerte liegt, ist der Wert bei der Konvertierung unverändert.