2010-11-05 31 views
6

!: Xin lưu ý rằng tôi đang nói về không được khai báo khai báo. Tôi biết đó là một thuật ngữ có thể không chính thức và ý tôi là nó không phải là một typedef và nó không khai báo một đối tượng của kiểu ẩn danh. Trong những trường hợp này mọi thứ đều rõ ràng.các lớp, cấu trúc, công đoàn và enums rỗng không được gắn thẻ ẩn danh

Câu hỏi 1:
nào dưới đây là một chương trình cũng như hình thành C++? (Trắc nghiệm)

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

Ghi chú:
MSVC9.0 chấp nhận cả ba. Trên số một nó đưa ra một cảnh báo. Trên số hai và ba, chúng tôi nhận được 0 lỗi và 0 cảnh báo. Comeau trực tuyến chỉ chấp nhận số ba, số một và hai không biên dịch với một thông báo chẩn đoán "khai báo không khai báo bất cứ điều gì". Nếu, trong số hai, liệt kê nặc danh chứa ít nhất một điều tra viên, số hai được chấp nhận hợp pháp bởi trình biên dịch comeau.

Nếu trình biên dịch comeau là đúng, và đây là hành vi chuẩn, thì tôi thấy một số mâu thuẫn trong đó. Tôi có thể hiểu tại sao số một nên bị từ chối. Tôi cũng sẽ hiểu tại sao số hai nên bị từ chối (tuyên bố không có gì), nhưng trong trường hợp này số ba cũng nên bị từ chối. Và nếu số ba không nên bị từ chối, thì sự khác biệt duy nhất tôi thấy với số một là phạm vi của các thành viên của một liên minh anoymous là phạm vi bên ngoài. Nhưng đó cũng là trường hợp với enums, vì vậy, yêu cầu của tôi là nên số ba được chấp nhận thì nên số hai.

Câu hỏi 2:
Nếu comeau là đúng, những gì cân nhắc tôi thiếu trong phán quyết trên của tôi?

P.S. Tôi đã viết một email để hỗ trợ comeau. Tôi sẽ đăng câu trả lời của họ ngay sau khi tôi nhận được nó.

Trả lời

3

Không có điều gì là hợp pháp. Xem [dcl.dcl] đoạn 3.

+0

Với Ví dụ thực tế cho 'enum {};', không kém! Tôi là một luật sư ngôn ngữ wannabe. – Cubbi

Các vấn đề liên quan