定义匿名结构是否合法?

Is it legal to define an anonymous struct?

以下代码是否合法?:

struct
{
    int  x;
};

这段代码只是定义了一个未命名的结构。我不打算创建这种类型的对象,也不需要以任何其他方式使用这种结构。它只是作为一些复杂的宏扩展的副作用出现在源代码中。

虽然没用,但我觉得没问题。只是另一段可以编译然后完全优化的代码。

然而,在现实世界中,结果与我的预期大相径庭:

GCC 8.3报错:

error: abstract declarator '<unnamed struct>' used as declaration

Clang 8.0.0也报错:

error: anonymous structs and classes must be class members
warning: declaration does not declare anything [-Wmissing-declarations]

只有 MSVC 2017 认为此类源没有问题。

所以,问题是:谁是对的?标准中是否有明确禁止此类声明的相关引用?

编辑:
该项目使用 C++11。但对于 C++98、C++11 和 C++17,错误消息是相同的。

不,这是不允许的。 GCC 和 Clang 是对的。

根据 [dcl.dcl]/3 (7 Declarations) in N3337 (C++11 final draft),一个 class 声明必须为程序引入一个名称。例如,以下是无效的:

enum { };
typedef class { }; 

(注意:这不是 C++11 独有的。在 N4140 (C++14 final draft) it is [dcl.dcl]/5 (7 Declarations). In N4659 (C++17 final draft) it is [dcl.dcl]/5 (10 Declarations) 中。)