2016-06-04 8 views
5

Il progetto di standard di N4567 suggerisce che un costruttore di default in default è definita come eliminato se-secondo a 12,1, paragrafo 4:Perché un sindacato composto da membri con varianti costanti non ha alcun costruttore predefinito predefinito?

X è un sindacato e tutte dei suoi componenti variante sono di const -qualificato tipo (o matrice dello stesso),

In altre parole, equivale a dire che, se uno dei suoi membri varianti non è const-qualificato, la regola di cui sopra non si applica. La mia domanda è:

  • Cosa c'è di così speciale avere tutte i suoi membri const-qualificato (rispetto alla situazione opposta in cui almeno uno di questi non è const qualificato), e in che prospettiva è che profondamente correlato a un costruttore predefinito predefinito?

risposta

4

Supponiamo di avere un sindacato con i membri solo const:

union Foo { 
    const int x; 
    const double y; 
} 

un costruttore di default dovrebbe decidere quale dei membri per inizializzare e diventare il membro attivo. Una volta creato, non è possibile modificare il valore di un membro (sono tutti costanti), pertanto non è possibile modificare quale sia il membro attivo. Quindi una tale costruzione sarebbe piuttosto inutile come unione.

D'altra parte, se un membro non è const:

union Bar { 
    int x; 
    const double y; 
    Bar() : y(10.0) {} 
} 

un costruttore di default potrebbe avere un senso, perché è ancora possibile in seguito cambiare il membro attivo tramite

Bar b; 
b.x = 10; 
+1

non lo faccio capire perché un tale costrutto sarebbe inutile. Sarebbe una variante immutabile. – Columbo

+1

@Columbo: In generale, sarebbe preferibile progettare il tipo in modo da non creare immutabilità, quindi utilizzare 'const Foo' per aggiungere immutabilità come e quando si desidera. Ma questa è solo una scelta di design. –

Problemi correlati