2016-05-24 16 views
1

C++ setzt bool Werte automatisch auf true oder false, auch wenn der Typ tatsächlich einen 1 Byte Wert enthält.Verwendung von reinterpret_cast mit bool

So bool(123) == true ist wahr, mit

int i = 123; 
bool b = i; 
int j = b; 

j1 den Wert nimmt.


Aber ist dies der Fall bleiben, wenn reinterpret_cast mit bool* Zeiger verwendet wird? Z.B.

static_assert(sizeof(bool) == 1, "assuming sizeof(bool) is one in this example..."); 
std::uint8_t i = 123; 
bool* b = reinterpret_cast<bool*>(&i); 

int j = *b; // j becomes 1 
if(*b == true) ... // condition is true 

Sind diese Ergebnisse garantiert wahr zu sein, oder ist es nicht definiertes Verhalten. (d. h. kann kompiliert werden unter der Annahme, dass bool Objekte bereits intern als 1 und 0 dargestellt sind).

+1

_ "Sind diese Ergebnisse garantiert, oder ist es ein undefiniertes Verhalten?" _ Nun, die Verwendung von 'reininterpret_cast' ist eher ein nicht spezifiziertes Verhalten_. –

+2

Woher bekommst du, dass die Größe von Bool 1 sein muss? – NathanOliver

+0

@NathanOliver Ist das nicht die kleinste Größe, die für einen Datentyp ausgewählt werden könnte? –

Antwort

6

Von [basic.lval]:

Wenn ein Programm versucht, den gespeicherten Wert eines Objekts durch einen glvalue anderer als einer der folgenden Typen zuzugreifen das Verhalten nicht definiert ist:
(10.1) - der dynamische Typ des Objekts,
(10.2) - eine cv-qualifizierte Version des dynamischen Typs des Objekts,
(10.3) - ein ähnlicher Typ (wie in 4.4 definiert) an den dynamischen Typ des Objekts ,
(10.4) - ein Typ, bei dem es sich um den Typ mit oder ohne Vorzeichen handelt ng auf den dynamischen Typ des Objekts,
(10.5) - ein Typ, der der signierten oder vorzeichenlosen Typ einer cv-qualifizierten Version des dynamischen Typs des Objekts,
(10.6) - ein Aggregat oder Union ist Typ, der einen der oben genannten Typen unter seinen Elementen oder nicht statischen Datenelemente (einschließlich rekursiv, ein Element oder nicht-statische Daten Mitglied eines Unteraggregats oder enthaltenen Union),
(10,7) - ein Typ, der ein (a) möglicherweise cv-qualifiziert) Basisklasse Typ des dynamischen Typs des Objekts,
(10.8) - ein char oder unsigned char Typ.

Sie versuchen, den gespeicherten Wert eines uint8_t durch eine glvalue von bool Art zuzugreifen. Das passt zu keiner dieser 8 Kategorien, daher ist das Verhalten undefiniert.

+0

Aber da 'uint8_t' eine Implementierung ist typedef definiert, und dieser Typ ist höchstwahrscheinlich 'unsigned char', würde das Ergebnis Implementierung-bedingt nicht gut definiert, pro 10.8? – rodrigo

+2

@rodrigo Es spielt keine Rolle - der Zugriff auf ein 'bool' durch ein' unsigned char * 'ist gut definiert, aber das Gegenteil ist nicht der Fall. – molbdnilo

Verwandte Themen