以下代码合法吗?:
struct
{
int x;
};
此代码仅定义了一个未命名的结构。我既不打算创建这种类型的对象,也不需要以其他任何方式使用此结构。它只是作为某些复杂的宏扩展的副作用在源中出现。
虽然没有用,但我认为没有问题。只是另一段可以编译然后完全优化的代码。
但是,在现实世界中,结果与我的预期有很大不同:
GCC 8.3报告错误:
Clang 8.0.0也报告了一个错误:
只有MSVC 2017认为此类来源没有问题。
所以,问题是:谁是对的?标准中是否有明确禁止此类声明的相关引用?
编辑:
该项目使用C++ 11。但是对于C++ 98,C++ 11和C++ 17,错误消息是相同的。
最佳答案
不,这是不允许的。 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最终草案)中,它是[dcl.dcl]/5 (10 Declarations)。)
关于c++ - 定义未命名结构是否合法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55916208/