C++ tem a regra de "sequência inicial comum" para uniões:
Em uma união de layout padrão com um membro ativo (11.5) do tipo struct T1, é permitido ler um membro de dados não estático m de outro membro de união do tipo struct T2, desde que m faça parte da sequência inicial comum de T1 e T2; o comportamento é como se o membro correspondente de T1 fosse nomeado.
Como isso interage com structs aninhados ? Por exemplo, é permitido acessar u.s.s1.a1
, u.s.s1.a2
, u.s.s2.a1
, u.s.s2.a2
se u.b
estiver ativo? Ou o fato de S::s1
e B::b1
terem tipos diferentes implica que S
e B
não têm uma sequência inicial comum ?
struct A
{
int a1, a2;
};
struct S
{
A s1, s2;
};
struct B
{
int b1, b2, b3, b4;
};
union U
{
S s;
B b;
};
/******************/
U u;
u.s.s1.a1 = 1;
u.b.b1 == 1; // UB?
/******************/