! 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.
Z rzeczywistym przykładem "enum {};", nie mniej! Jestem takim niedoszłą prawniczką. – Cubbi