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

时间:2019-04-30 07:49:27

标签: c++ c++11 unnamed-class

以下代码合法吗?

struct
{
    int  x;
};

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

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

但是,在现实世界中,结果却与我的预期完全不同:

GCC 8.3报告错误:

  

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

Clang 8.0.0也报告了一个错误:

  

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

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

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

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

1 个答案:

答案 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 }}。