Il seguente codice è legale (in C++ 11/14)?È legale attivare i sindacati nidificati tramite l'indirizzo dei loro membri?
bool foo() {
union bar { int i; bool b; };
union baz { char c; bar b; };
auto b = baz{'x'};
auto barptr = &b.b;
auto boolptr = &barptr->b;
new (boolptr) bool{true};
return b.b.b;
}
Questo esempio è stupido, ma sto giocando intorno con un variadic variant
implementazione che utilizza i sindacati nidificate al posto di un blocco char []
per i membri variante, e permettendo questo renderà il mio attuale tentativo di pulitore costruttore di copia .
Per rompere il basso in due subquestions:
- è l'assegnazione di
boolptr
accedendo un membro dellabarptr
legale anche seb.b
non è attiva? - La costruzione sul posto di
boolptr
attivab.b
eb.b.b
?
I riferimenti allo standard sarebbero apprezzati.
forse parzialmente risposto qui: http://stackoverflow.com/questions/11373203/accessing-inactive-union-member-undefined –
C'è qualche motivo specifico per Supponiamo che l'espressione 'bb' sia più legale di' * (& (bb)) '? Perché altrimenti è abbastanza ovvio che entrambi sono ugualmente legali (nessuno sta seriamente argomentando che "b.b' è senza legge!) – MSalters