标签: 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,错误消息是相同的。

c++ c++11 unnamed-class

16
推荐指数
1
解决办法
1595
查看次数

如何从 C++ 中的未命名派生类调用非默认父构造函数?

在 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

5
推荐指数
1
解决办法
486
查看次数

一个未命名的结构可以变成静态的吗?

你能否使一个未命名的结构成为类的静态成员?

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)

c++ static unnamed-class

3
推荐指数
2
解决办法
109
查看次数