2011-06-30 10 views
5

Czy możliwe jest posiadanie anonimowej unii z członkami const? Mam następujący:Konstruktor i anonimowy związek z członkami const

struct Bar { 
    union { 
    struct { const int x, y; }; 
    const int xy[2]; 
    }; 
    Bar() : x(1), y(2) {} 
}; 

zg ++ 4.5 pojawia się błąd:

error: uninitialized member ‘Bar::<anonymous union>::xy’ with ‘const’ type ‘const int [2]’ 
+0

'struct {const int x, y; }; 'nie jest poprawny C++. Czy pytasz, czy możesz coś zrobić z GCC? –

+0

Dlaczego jest nieprawidłowa? Czy potrzebuje konstruktora z listą inicjalizacji? – user2023370

+0

Przełącznik GCC -pedantic wydaje się przydatny. "ISO C++ zabrania anonimowych struktur", mówi. Jeśli usuniemy 'const's powyżej, otrzymam to samo ostrzeżenie. – user2023370

Odpowiedz

3

To był problem w GCC, który został naprawiony w wersji 4.6. Twój kod działa teraz poprawnie.

Nadal zależy od rozszerzenia GCC, ponieważ używa anonimowej struktury, ale większość kompilatorów obsługuje je teraz. Także poniższy kod teraz buduje poprawnie z -pedantic:

struct Bar { 
    union { 
    const int x; 
    const int y; 
    }; 
    Bar() : x(1) {} 
}; 

Ten kod jest również akceptowane przez Clang i Visual Studio 2010 (ale nie z 2008 roku).

0

Tak. Jest to możliwe, ale musisz go zainicjować, gdy zostanie skonstruowany. Nie możesz zostawić go niezainicjowanego. Ale w tym konkretnym przypadku nie sądzę, że jest to możliwe, ponieważ nie można zainicjować tablicy na liście inicjalizacyjnej.

Nawiasem mówiąc, spojrzeć na ten interesujący temat:

0

nr Spróbuj użyć -pedantic przełącznik GCC:

warning: ISO C++ prohibits anonymous structs 

przykładu jest zatem również nielegalne z usuniętymi const.

+0

Obawiam się, że to nie odpowiada na pytanie. Anonimowe struktury to zakazane, ale nie anonimowe związki. –

+0

@SamHocevar Thankyou! Doceniam twój wkład, ale na pewno odpowiedź jest technicznie nadal nie: szukałem legalnego C++. – user2023370

+0

Może mógłbyś zatem edytować pytanie? Stwierdza: "Czy możliwe jest posiadanie anonimowej unii z członkami stałymi" _ której odpowiedź wydaje się być twierdząca. Wygląda na to, że masz inny problem z anonimowymi 'struct's. –