16

以下代码合法吗?:

struct
{
    int  x;
};

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

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

然而,在现实世界中,结果与我的预期完全不同:

GCC 8.3 报错:

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

Clang 8.0.0 也报错:

错误:匿名结构和类必须是类成员
警告:声明没有声明任何东西[-Wmissing-declarations]

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

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

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

4

1 回答 1

15

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

根据N3337(C++11 最终草案)中的[dcl.dcl]/3 (7 Declarations),类声明必须以一个名称引入程序。例如,以下内容无效:

enum { };
typedef class { }; 

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

于 2019-04-30T08:01:18.483 回答