以下代码合法吗?
struct
{
int x;
};
此代码仅定义一个未命名的结构。我既不打算创建这种类型的对象,也不需要以其他任何方式使用此结构。它只是在源代码中显示为某些复杂的宏扩展的副作用。
虽然没有用,但我认为没有问题。只是可以编译然后完全优化的另一段代码。
但是,在现实世界中,结果却与我的预期完全不同:
GCC 8.3报告错误:
错误:抽象声明符'<未命名结构>'用作声明
Clang 8.0.0也报告了一个错误:
错误:匿名结构和类必须是类成员
警告:声明未声明任何内容[-Wmissing-declarations]
只有MSVC 2017认为此类源没有问题。
所以,问题是:谁是对的?标准中是否有相关的报价明确禁止此类声明?
修改:
该项目使用C ++ 11。但是对于C ++ 98,C ++ 11和C ++ 17,错误消息是相同的。
答案 0 :(得分:15)
否,这是不允许的。 GCC和Clang是正确的。
在[dcl.dcl]/3 (7 Declarations)中的N3337 (C++11 final draft)中,类声明必须以一个名称引入程序。例如,以下无效:
enum { };
typedef class { };
(注意:这并非C ++ 11所独有。在N4140 (C++14 final draft)中是[dcl.dcl]/5 (7 Declarations)。在N4659(C ++ 17最终草案)中是{{3 }}。