定义未命名结构是否合法?

Igo*_*r G 16 c++ c++11 unnamed-class

以下代码合法吗?:

struct
{
    int  x;
};
Run Code Online (Sandbox Code Playgroud)

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

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

但是,在现实世界中,结果与我的预期有很大不同:

GCC 8.3报告错误:

错误:抽象声明符“ <未命名结构>”用作声明

Clang 8.0.0也报告了一个错误:

错误:匿名结构和类必须是类成员
警告:声明未声明任何内容[-Wmissing-declarations]

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

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

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

L. *_* F. 15

不,这是不允许的。GCC和Clang是正确的。

[dcl.dcl] / 3(7声明)N3337(C ++ 11最终稿),类声明必须引入在一个名字到该程序。例如,以下无效:

enum { };
typedef class { }; 
Run Code Online (Sandbox Code Playgroud)

(注意:这不是C ++ 11独有的。在N4140(C ++ 14最终草案)中,它是[dcl.dcl] / 5(7个声明)。在N4659(C ++ 17最终草案)中,它是[dcl.dcl] / 5(7个声明)[dcl.dcl] / 5(10个声明)。)

  • @YSC-这不是[名称](https://timsong-cpp.github.io/cppwp/n3337/basic#4)。 (4认同)
  • @YSC-是的,并且在类的范围内,名称可以引用成员。您需要完全限定它的事实,这意味着它根本不会引入该名称。这是关于声明性区域和范围的。 (3认同)
  • @StoryTeller在N3337中,它是[dcl.dcl] / 3 (2认同)