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个声明)。)