c++ - 匿名空无标记类、结构、 union 和枚举

标签 c++ anonymous-types language-lawyer

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

问题一:
以下哪个是格式正确的 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 编译器正确接受。

如果 comeau 编译器是正确的,并且这是标准行为,那么我会发现其中存在一些不一致之处。我能理解为什么要拒​​绝第一条。我也会理解为什么第二个应该被拒绝(什么都不声明),但在这种情况下,第三个也应该被拒绝。如果第三个不应该被拒绝,那么我看到的与第一个的唯一区别是匿名联盟成员的范围是外部范围。但枚举也是如此,所以,我的主张是,如果第三个被接受,那么第二个也应该被接受。

问题二:
如果 comeau 是正确的,我在上述判断中遗漏了哪些考虑因素?

附言我已经写了一封电子邮件给 comeau 支持。我会在收到答案后立即发布。

最佳答案

这些都不合法。参见 [dcl.dcl] 第 3 段。

关于c++ - 匿名空无标记类、结构、 union 和枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4106718/

相关文章:

c++ - 为什么连接的信号有参数但插槽没有参数?

java - Java 中的匿名类和预定义类之间有哪些相关区别?

c++ - 从非实例化上下文中引用特定模板特化 : instantiation or not?

c++ - int a[] = {1,2,};为什么允许在初始化列表中使用尾随逗号?

c++ - 我如何将 boost::this_thread::get_id() 转换为 int?

c++ - 如何在 Qt 5.4 程序中的文件之间共享 OpenGL 3.3+ 函数和上下文

c++ - Makefiles,从 VC6 迁移到 Visual Studio 2010

c# - 如何将键值对列表转换为动态对象

javascript - 使用 Javascript IFFE 获取 Uncaught TypeError 不是一个函数

c++ - 为什么允许 int 和 const int 的不同转换函数?