2016-01-08 19 views
14

ho qualcosa di simile:Accesso stesso tipo di membro attivo nei sindacati

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

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

ho alcuni vettori di questi, essendo per tutti gli usi della memoria di lavoro, in cui io uso i campi di conseguenza dopo il contesto semantico.

So che è un comportamento non definito leggere un campo in un'unione, quando l'ultimo membro attivo era un altro campo (e tipo?). Questo è importante quando i tipi e il layout corrispondono esattamente?

Ho commentato alcune altre domande simili, chiedendo riferimenti che garantiscano il comportamento, ma non è ancora venuto fuori nulla - quindi questa domanda.

+0

Eventuali duplicati di [C++ comportamento non definito con i sindacati] (http://stackoverflow.com/questions/17273320/c-undefined-behaviour-with-unions) – 4386427

+0

Non è un buon duplicato. Non c'è un riferimento standard. – Bathsheba

+0

Questo è in realtà legale. – Simple

risposta

12

è possibile leggere l'altro membro in questo caso .

Questo è ciò che lo standard C++ 11/14 ha da dire:

9,5 - Sindacati

In un'unione, tutt'al più uno dei membri di dati non statici può essere attivo in qualsiasi momento, ovvero il valore di al massimo uno dei dati non statici I membri possono essere memorizzati in un sindacato in qualsiasi momento.

Ma la nota subito dopo la sezione rende l'istanza particolare azioni legali da una speciale garanzia è fatto al fine di semplificare l'utilizzo dei sindacati:

[Nota: Se uno standard- l'unione di layout contiene diverse strutture standard che condividono una sequenza iniziale comune (9.2) e se un oggetto di questo tipo di unione layout standard contiene una delle strutture standard , è consentito ispezionare la sequenza iniziale comune di qualsiasi di membri della struttura con layout standard; vedi 9.2. - end nota]

E il tuo struct s fare la parte una sequenza iniziale comune:

9.2.16 - I membri della classe

La sequenza iniziale comune di due serie -layout struct (Clause 9) types è la sequenza più lunga di dati non statici membri e campi bit nella dichiarazione o der, a partire dalla prima entità in ciascuna delle strutture, in modo che le entità corrispondenti dispongano di tipi compatibili con il layout e nessuna delle due entità sia un campo di bit o entrambi campi di bit con la stessa larghezza.

+2

La nota immediatamente successiva alla sezione citata lo rende legale: "[Nota: una garanzia speciale è stata creata per semplificare l'uso dei collegamenti: Se un unione di layout standard contiene più strutture standard che condividono un iniziale comune sequenza (9.2) e se un oggetto di questo tipo di unione layout standard contiene una delle strutture di layout standard, è consentito ispezionare la sequenza iniziale comune di uno qualsiasi dei membri della struttura di layout standard , vedere 9.2. -end nota] " – Simple

+0

Dato che questa risposta ha un punteggio pari a zero e i commenti potrebbero essere interessanti, lo farò wiki. – Bathsheba

+0

@Bathsheba 9.2.16 specificare che la "sequenza iniziale" è "la sequenza più lunga [...] tale che abbia tipi di layout compatibili [...].", Quindi penso che in questo caso sia l'intera struct dal 'float' e' float' obvisouly hanno tipi di layout compatibili. – Holt