Diese Linie *((int*)(&someValue)) = 50;
ist mindestens nicht Standard. Die Implementierung könnte einen niedrigeren Rang für bool (etwa 1 oder 2 Bytes) für int (etwa 4 Bytes) verwenden. In diesem Fall würden Sie über die Variable schreiben und möglicherweise eine andere Variable löschen.
Und wie Sie im Kommentar gesagt wurden, dank der strengen Aliasing-Regel fast jeder Zugriff durch einen Casted Pointer kann als Undefined Behavior von einem Compiler gesehen werden. Die einzige fast Recht ein (für die strenge Aliasing-Regel) wäre:
*((char *) &someValue) = 50;
auf einem Little-Endian-System und
*(((char *) &someValue) + sizeof(bool) - 1) = 50;
auf einem Big-Endian eines (Byte-Zugriff noch nicht sein verboten).
Wie auch immer, da die Darstellung von Bool nicht durch den Standard spezifiziert ist, kann das Schreiben von etwas in einem Bool je nach Implementierung zu True oder False führen. Zum Beispiel könnte eine Implementierung nur das niedrigste Bit berücksichtigen (wahr, wenn val & 1 ist 1, sonst 0), ein anderes könnte alle Bits berücksichtigen (wahr für irgendeinen Wert ungleich 0, falsch für nur 0). Das einzige, was der Standard sagt, ist, dass eine Umwandlung von 0 zu false führt und von einem 0 nicht zu True führt.
aber wurde durch Standard vorgeschrieben ist die Umwandlung von Bool in int:
4.5 Integral promotions [conv.prom]
...
A prvalue of type bool can be converted to a prvalue of type int, with false becoming zero and true becoming one.
So voll dies erklärt, dass ein Bool Anzeige nur 0 oder 1 geben kann - auch wenn, wie die vorherige Operation aufgerufen UB, alles könnte hier passieren, einschließlich dieser Anzeige
AFAIK Ihr Code zeigt UB, wie es gegen strenge Aliasing-Regel geht. – Arunmu
Auch beim Schreiben in 'someValue' kreuzt man die Speicheranforderungen für' bool' – Arunmu
Warum würdest du diese Dinge überhaupt versuchen *? –