Sortiert nach meine vorherige Frage :
Zählen Elemente von Arrays als eine gemeinsame Anfangssequenz?
%Vor%Laut dieser cppreference-Seite :
In einer Standard-Layout-Union mit einem aktiven Mitglied der Nicht-Union-Klasse T1 ist es erlaubt, ein nicht-statisches Datenelement m eines anderen Union-Members der Nicht-Union-Klasse T2 zu lesen, sofern m Teil der gemeinsame Anfangsfolge von T1 und T2 ....
Wäre das legal, oder wäre es auch eine illegale Art von Punning?
C ++ 11 sagt (9.2):
Wenn eine Standard-Layout-Union zwei oder mehr Standard-Layout-Strukturen enthält, die eine gemeinsame Anfangssequenz teilen, und wenn das Standard-Layout-Union-Objekt derzeit eine dieser Standard-Layout-Strukturen enthält, ist es erlaubt den gemeinsamen Anfangsteil von irgendwelchen von ihnen zu überprüfen. Zwei Standard-Layout-Strukturen teilen sich eine gemeinsame Initiale Sequenz, wenn entsprechende Mitglieder Layout-kompatible Typen haben und keiner der beiden Member ist ein Bit-Feld oder beide sind Bitfelder mit der gleichen Breite für eine Folge von einem oder mehreren Anfangselementen.
Ob Arrays unterschiedlicher Größe eine gültige gemeinsame Anfangssequenz bilden, sagt 3.9:
Wenn zwei Typen T1 und T2 vom gleichen Typ sind, dann sind T1 und T2 Layout-kompatible Typen
Diese Arrays sind nicht vom selben Typ. Dies trifft nicht zu. Es gibt keine spezielle Ausnahme für Arrays, daher sind die Arrays möglicherweise nicht Layout-kompatibel und bilden keine gemeinsame Anfangssequenz.
In der Praxis kenne ich jedoch einen Compiler (GCC), der:
Ich vermute, dass viele andere Compiler einen ähnlichen Ansatz verfolgen. In Ihrem Beispiel, in dem Sie über das Union-Objekt type-pun tun, geben solche Compiler Ihnen das erwartete Ergebnis - das Lesen vom inaktiven Member sollte Ihnen einen Wert geben, der über das inaktive Member geschrieben wurde.
Tags und Links arrays c++ language-lawyer unions