2010-11-05 9 views
6

! Uwaga!: Należy pamiętać, że mówię o deklaracjach nieoznaczonych. Wiem, że jest to termin nieformalny i mam na myśli to, że deklaracja nie jest typedef i nie deklaruje obiektu typu anonimowego. W tych przypadkach wszystko jest jasne.anonimowe puste nieoznakowane klasy, struktury, związki i wyliczenia

Pytanie 1:
które z poniższych jest program dobrze uformowaną C++? (Wielokrotnego wyboru)

//One 
int main(){ 
    struct{}; //or class{}; should be the same 
} 
//Two 
int main(){ 
    enum{}; 
} 
//Three 
int main(){ 
    union{}; 
} 

Uwagi:
MSVC9.0 akceptuje wszystkie trzy. Na pierwszym miejscu daje ostrzeżenie. Na numer dwa i trzy otrzymujemy 0 błędów i 0 ostrzeżeń. Online comeau akceptuje tylko numer trzy, numery jeden i dwa nie kompilują się z komunikatem diagnostycznym "deklaracja niczego nie deklaruje". Jeśli w numer dwa, anonimowe wyliczenie zawiera co najmniej jeden moduł wyliczający, numer dwa jest poprawnie akceptowany przez kompilator comeau.

Jeśli kompilator comeau jest poprawny i jest to standardowe zachowanie, to widzę w nim niespójność. Rozumiem, dlaczego numer jeden powinien zostać odrzucony. Rozumiem również, dlaczego numer dwa powinien zostać odrzucony (nic nie deklaruje), ale w tym przypadku również trzecia powinna zostać odrzucona. A jeśli nie można odrzucić liczby trzeciej, jedyną różnicą, którą widzę z numerem jeden, jest to, że zakres członków anoimicznego związku jest zasięgiem zewnętrznym. Ale tak też jest w przypadku wyliczenia, więc moim twierdzeniem jest, że jeśli liczba trzecia zostanie zaakceptowana, to tak powinno być numer dwa.

Pytanie 2:
Jeśli comeau jest poprawny, co rozważania mi brakuje w moim powyższym wyroku?

P.S. Napisałem wiadomość e-mail do supportu comeau. Opublikuję odpowiedź, gdy tylko ją otrzymam.

Odpowiedz

3

Żadne z nich nie jest legalne. Zobacz [dcl.dcl] akapit 3.

+0

Z rzeczywistym przykładem "enum {};", nie mniej! Jestem takim niedoszłą prawniczką. – Cubbi