Vraag Toegang tot hetzelfde type inactief lid in vakbonden


Ik heb zoiets als dit:

union DataXYZ
{
    struct complex_t
    {
        float real, imag;
    } complex;

    struct vector_t
    {
        float magnitude, phase;
    } vector;
};

Ik heb een aantal vectoren hiervan, zijnde geheugen voor werkruimten voor algemene doeleinden, waarbij ik de velden dienovereenkomstig gebruik na de semantische context.

Ik weet dat het een ongedefinieerd gedrag is om een ​​veld in een vakbond te lezen, toen het laatste actieve lid een ander veld was (en typen?). Maakt dit uit wanneer de typen en lay-out exact overeenkomen?

Ik heb commentaar gegeven op enkele andere soortgelijke vragen, en ik heb gevraagd naar referenties die het gedrag garanderen, maar er kwam nog niets - vandaar deze vraag.


15
2018-01-08 12:39


oorsprong


antwoorden:


Ja je kunt het andere lid hierin lezen specifieke zaak.

Dit is wat de C ++ 11/14-norm te zeggen heeft:

9.5 - vakbonden

In een vak kan maximaal één van de niet-statische gegevensleden actief zijn   op elk moment, dat wil zeggen, de waarde van maximaal één van de niet-statische gegevens   leden kunnen op elk moment in een vak worden opgeslagen.

Maar de opmerking direct na de sectie maakt uw specifieke instantie legaal, aangezien er een speciale garantie wordt gegeven om het gebruik van vakbonden te vereenvoudigen:

[ Notitie: Als een standaardlay-out-unie meerdere standaardlay-outs bevat   structs met een gemeenschappelijke beginreeks (9.2) en als een object   van dit standaard lay-out vaktype bevat een van de standaard lay-out   structs, is het toegestaan ​​om de gemeenschappelijke beginvolgorde van om het even welke te inspecteren   van standaard lay-out struct leden; zie 9.2. -eindnoot ]

En jouw structs deel een gemeenschappelijke beginvolgorde:

9.2.16 - Klasse leden

De gemeenschappelijke beginvolgorde van twee standaardlay-outs   struct (clausule 9) is de langste reeks niet-statische gegevens   leden en bitvelden in declaratie volgorde, beginnend met de eerste   een dergelijke entiteit in elk van de structs, zodanig dat overeenkomstige entiteiten   hebben layout-compatibele typen en beide entiteiten is geen bitveld   of beide zijn bitvelden met dezelfde breedte.


13