
Roland Schwarz wrote:
Hmm, you may have missed the details of my example, so I repeat the essentials:
struct foo1 { unsigned data[4]; };
struct foo2 { unsigned data[2]; };
struct bar { foo1 a; foo2 b; };
union { data[6]; bar b; };
Are those types not "layout compatible" as the standard requires for the access I intend? I mean foo1, foo2 are POD. So the question boils down to whether foo1 and unsigned data[4] are layout compatible, not?
The answer is still no. The standard says (9.2/16):
If a POD-union contains two or more POD-structs that share a common initial sequence, and if the POD-union object currently contains one of these POD-structs, it is permitted to inspect the common initial part of any of them. Two POD-structs share a common initial sequence if corresponding members have layout-compatible types (and, for bit- fields, the same widths) for a sequence of one or more initial mem- bers. This is the only case where access through a different member is allowed.
unsigned data[6] is not a POD-struct, even though it is a POD. Furthermore, you definitely can't access foo2's data, because there might be padding between foo1 and foo2. (Not likely that any compiler does that, but they're allowed to.) Sebastian Redl