2010-11-05 41 views
6

!免责声明!:请注意,我正在谈论未标记的声明。我知道这可能是一个非正式的术语,我的意思是说声明不是一个typedef,它不声明匿名类型的对象。在这些情况下,一切都很清楚。匿名空untagged类,结构,联盟和枚举

问题1:
其下面的是一合式的C++程序? (可多选)

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

备注:
MSVC9.0接受所有三个。第一,它发出警告。在二号和三号我们得到0个错误和0个警告。在线新秀只接受第三名,第一名和第二名未能通过诊断消息进行编译,“声明没有声明任何内容”。如果在第二位,匿名枚举至少包含一个枚举器,则第二位被comeau编译器正确接受。

如果comeau编译器是正确的,并且这是标准行为,那么我看到它有一些不一致。我能理解为什么第一应该被拒绝。我也理解为什么第二位应该被拒绝(没有声明),但在这种情况下,第三位也应该被拒绝。如果不应该拒绝第三名,那么我认为唯一的区别就是,一个有害联盟的成员范围是外部范围。但是枚举也是如此,所以,我的观点是,如果第三位被接受,那么第二位应该被接受。

问题2:
如果科莫是正确的,我在我的上述判断缺什么考虑?

附:我写了一封电子邮件给comeau支持。我会尽快发布答案。

回答

3

没有一个是合法的。参见[dcl.dcl]第3段。