Acceso a miembros inactivos del mismo tipo en sindicatos.

Tengo algo como esto:

union DataXYZ { struct complex_t { float real, imag; } complex; struct vector_t { float magnitude, phase; } vector; }; 

Tengo algunos vectores de estos, siendo la memoria de espacio de trabajo de propósito general, donde uso los campos en consecuencia después del contexto semántico.

Sé que es un comportamiento indefinido leer un campo en una unión, cuando el último miembro activo era otro campo (¿y tipo?). ¿Importa esto cuando los tipos y el diseño coinciden exactamente?

He estado comentando sobre otras preguntas similares, solicitando referencias que garanticen el comportamiento, pero no surgió nada todavía, de ahí esta pregunta.

, puedes leer el otro miembro en este caso particular .

Esto es lo que el estándar C ++ 11/14 tiene que decir:

9.5 – Uniones

En una unión, como máximo, uno de los miembros de datos no estáticos puede estar activo en cualquier momento, es decir, el valor de uno de los miembros de datos no estáticos puede almacenarse en una unión en cualquier momento.

Pero la nota inmediatamente después de la sección hace que su caso particular sea legal, ya que se otorga una garantía especial para simplificar el uso de sindicatos :

[ Nota : si una unión de diseño estándar contiene varias estructuras de diseño estándar que comparten una secuencia inicial común (9.2), y si un objeto de este tipo de unión de diseño estándar contiene una de las estructuras de diseño estándar, está permitido inspeccionar la secuencia inicial común de cualquiera de los miembros de la estructura de diseño estándar; ver 9.2. – nota final ]

Y sus struct comparten una secuencia inicial común:

9.2.16 – Miembros de la clase

La secuencia inicial común de dos tipos de estructuras de disposición estándar (Cláusula 9) es la secuencia más larga de miembros de datos no estáticos y campos de bits en orden de statement, comenzando con la primera entidad de este tipo en cada una de las estructuras, de manera que las entidades correspondientes tengan Los tipos compatibles con el diseño y ninguna de las dos entidades es un campo de bits o ambos son campos de bits con el mismo ancho.