具有空主体的类是否为不完整类型

Is a class with empty body an incomplete type?

本文关键字:类型 是否 主体      更新时间:2023-10-16

类声明使类成为不完整类型,因此不能定义类的任何对象。不完全类型的定义是它的成员没有被指定。这是否意味着在定义中没有指定成员的空主体类使其成为不完整类型?

class Empty { };
Empty e1; // okay, but why?

具有空主体的类是不完整类型吗?

不,具有空主体的类只是一个空类,但仍然是一个完全定义的类。不完整类型是不可见完整定义的类型。

class Empty;
// Here, Empty is an incomplete type
class Empty { };
// Here, Empty is a complete type

c++ 11标准第3.9/5段:

已声明但未定义的类、未知大小的数组或元素类型不完整的数组为不完全定义的对象类型。不完全定义的对象类型和void类型是不完整的类型(3.9.1)。对象不能定义为不完整类型。

同样,根据第9.2/2段:

在类说明符的结尾}处,类被认为是完全定义的对象类型(3.9)(或完整类型)。[…]

正如其他人所说,它不是一个不完整的类型。在c++中,有时需要这样做。

考虑以下内容:

template<class T>
class Field
{
public:
    virtual std::string toString() const = 0;
};

如何将其存储在集合中?答案是,我不能。但是我可以这样做:

class FieldBase 
{
public:
    virtual ~FieldBase() = 0 { }; // virtual destructor needed, but no other members
    virtual std::string toString() const = 0;
};

现在,从技术上讲,根据你的问题,它没有定义任何成员。它是抽象的。它不能被实例化。但是现在我们可以这样做:

template<class T>
class Field : public FieldBase
{
     virtual std::string toString() const { /* ... */ };
};

我知道这稍微偏离了你原来的问题,但它确实说明了基类没有任何定义(除了意图),我们现在可以将这些模板类存储在std::vector<FieldBase*>集合中。

是的,它是一个完整的类型。当我最后一次检查大小是一个字节(至少在MS的编译器上)。

为了创建一个不完整的结构体,省略括号:

struct Empty;

这也被称为前向声明结构,而不是结构的定义。