2016-07-10 14 views
4

Ich habe einen typisierten EnumC++ 11 Casting Aufzählungen zu Ints

enum side : int {_white=0, 
       _yellow=1, 
       _green=2, 
       _blue=3, 
       _red=4, 
       _orange=5}; 

jedoch gcc-5 verwendet, die Compiler sagt es nicht static_cast im folgende Szenario verwenden kann:

side value 
function(static_cast<int *>(&value)) 

Warum ist das? Doing static_cast<int>(value)) verursacht keinen Fehler.

+2

verschiedene Typen, sollten Sie 'reinterpret_cast' nicht verwenden? –

+5

Sie können ein Bool in ein Double konvertieren, aber das bedeutet nicht, dass ein Bool Pointer sinnvollerweise als Double Pointer behandelt werden kann. –

+0

Ich dachte, eine typisierte enum war im Wesentlichen der gleiche Datentyp? Da es als 'int' eingegeben wurde, sollte der Compiler das akzeptieren können 'static_cast' no? Offensichtlich funktioniert 'reininterpret_cast', aber es ist ein bisschen wie ein Code-Geruch. –

Antwort

5

Ein Zeigertyp ist anders als nur eine Typkonvertierung. Der Zugriff über einen Zeiger lässt die Bytes gleich, liest sie aber anders. Dies ist nicht sicher für eine enum, weil es verschiedene Größen von int sein kann.

Eine Typumwandlung ist jedoch sicher, weil sie die enum in ein int als eine Kopie konvertiert. Die ursprüngliche enum könnte ein einzelnes Byte oder zwei Bytes sein, aber das spielt keine Rolle, wenn es einmal in 4 oder 8 Bytes kopiert wurde.