Werden Array-Elemente als gemeinsame Anfangssequenz gezählt?

9

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?

    
James Root 17.03.2016, 03:20
quelle

1 Antwort

4

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:

  • ignoriert die Regel "Common Initial Sequence" und
  • erlaubt type punning trotzdem, aber nur wenn Zugriffe "über den union type" sind (wie in Ihrem Beispiel), in diesem Fall wird die Regel "common initial sequence" indirekt befolgt (weil eine "common initial sequence" eine common bedeutet) initiales Layout auf den Architekturen, die der Compiler unterstützt).

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.

    
davmac 18.03.2016, 09:32
quelle

Tags und Links