匿名空的未标记的类,结构,联合和枚举

Arm*_*yan 6 c++ anonymous-types language-lawyer

!免责声明!:请注意,我在谈论无标记的声明.我知道这是一个非正式的术语,我的意思是声明不是typedef而且它不声明匿名类型的对象.在这些情况下,一切都很清楚.

问题1:
以下哪一项是格式良好的C++程序?(多项选择)

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

备注:
MSVC9.0接受全部三个.在第一,它发出警告.在第二和第三位,我们得到0错误和0警告.在线漫画只接受三号,第一和第二号无法编译,并带有诊断消息"声明未声明任何内容".如果在第二个中,匿名枚举包含至少一个枚举器,则getau编译器正确地接受第二个枚举.

如果comeau编译器是正确的,这是标准行为,那么我看到它有些不一致.我能理解为什么第一名应该被拒绝.我也理解为什么第二号应该被拒绝(没有声明),但在这种情况下,第三号也应该被拒绝.如果第三个不应该被拒绝,那么我在第一个看到的唯一区别是,一个无趣的联盟成员的范围是外部范围.但是枚举的情况也是如此,因此,我的主张是,如果第三个被接受,那么第二个应该被接受.

问题2:
如果结果是正确的,我在上述判断中缺少哪些考虑因素?

PS我已经写了一封电子邮件给了我的支持.我会在收到答案后立即发布答案.

Joh*_*itb 3

这些都是不合法的。请参阅 [dcl.dcl] 第 3 段。