以下代码合法吗?:
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,错误消息是相同的。
在 C++ 中,如果直接创建对象,则可以将一次性结构和类声明为未命名:
struct { int x; int y; } point;
Run Code Online (Sandbox Code Playgroud)
未命名的类也可以从基类继承。例如,这对于从基本处理器接口创建不同“处理器”的列表很有用。这是一个简单的例子:
struct Processor {virtual int op(int a, int b) = 0;};
struct : Processor {int op(int a, int b) override { return a+b; }} Adder;
struct : Processor {int op(int a, int b) override { return a*b; }} Multiplier;
Run Code Online (Sandbox Code Playgroud)
因此Adder
和 都Multiplier
成为接口的单个派生对象Processor
。但是,如果基础处理器具有更多结构并且具有需要参数的构造函数,该怎么办?让我们看这个例子:
class Processor {
private:
std::string name;
public:
virtual int op(int a, int b) = 0;
const std::string& getName() const { return name; …
Run Code Online (Sandbox Code Playgroud) c++ inheritance constructor default-constructor unnamed-class
你能否使一个未命名的结构成为类的静态成员?
struct Foo
{
struct namedStruct
{
int memb1, memb2;
};
static namedStruct namedStructObj;
struct
{
int memb1, memb2;
} unnamedStructObj;
};
Foo::namedStruct Foo::namedStructObj;
// The unnamed type doesn't seem to have a type you can write
Run Code Online (Sandbox Code Playgroud)