2016-06-04 10 views
5

Standardowy projekt jak z N4567 sugeruje, że defaulted konstruktor domyślny jest zdefiniowany jako usunięte if-według 12.1, pkt 4:Dlaczego połączenie składające się z const-qualified variant members powoduje brak domyślnego domyślnego konstruktora?

X jest unia i wszystko jej członków wariancie const -kwalifikowany typ (lub jego tablica),

Innymi słowy, jest równoznaczne z powiedzeniem, że jeśli jeden z jego wariantów nie ma uprawnień warunkowych, powyższa zasada nie ma zastosowania. Moje pytanie brzmi:

  • Co jest takiego specjalnego o konieczności wszystkie swoich członków const kwalifikowaną (w porównaniu do sytuacji odwrotnej, gdy co najmniej jeden z nich nie jest const kwalifikowaną), iw jakiej perspektywy jest to głęboko związane z domyślnym konstruktorem domyślnym?

Odpowiedz

4

Załóżmy, że masz związek z tylko const członków:

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

domyślny konstruktor będzie musiał zdecydować, który z członków zainicjować i stać się aktywnym członkiem. Raz utworzony nie można zmienić wartości dowolnego elementu (wszystkie są const), więc nie można również zmienić, który jest aktywnym członkiem. Tak więc taka konstrukcja byłaby raczej bezużyteczna jako związek.

Z drugiej strony, jeśli ktoś nie jest członkiem const:

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

domyślny konstruktor mogłoby mieć sens, ponieważ nadal można później zmienić aktywny członek poprzez

Bar b; 
b.x = 10; 
+1

nie wiem zrozum, dlaczego taka konstrukcja byłaby bezużyteczna. Byłby to niezmienny wariant. – Columbo

+1

@ Columbo: Generalnie lepiej byłoby zaprojektować typ, aby nie wbudować niezmienności, a następnie użyć 'const Foo', aby dodać niezmienność tak, jak i kiedy chcesz. Ale to tylko wybór projektu. –

Powiązane problemy