具有空主体的类是否为不完整类型
Is a class with empty body an incomplete type?
类声明使类成为不完整类型,因此不能定义类的任何对象。不完全类型的定义是它的成员没有被指定。这是否意味着在定义中没有指定成员的空主体类使其成为不完整类型?
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;
这也被称为前向声明结构,而不是结构的定义。
相关文章:
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 检查函数返回类型是否与STL容器类型值相同
- 检查某些类型是否是模板类 std::optional 的实例化
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 如何检查模板类型是否可以从给定类型构造
- 用于检测函数类型是否为否的特征
- 了解类型是否可调用
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 键入特征以检查类型是否可从流和 MSVC 读取
- 从双精度转换为整数的显式类型是否始终检查整数溢出?
- 如何获取类型是否真正可移动可构造
- 在编译时检查类型是否为 std::basic_string<T> C++
- 在C++中,转换为simd类型是否有未定义的行为
- POD类型是否完全等同于琐碎的标准布局类型
- 聚合类型是否意味着它也是标准布局
- 有没有一种方法可以使用SFINAE来检测一个类型是否实现了给定的抽象基类
- 验证(使用 static_assert)元组类型是否遵循某种顺序(有状态编译时检查)
- 强制转换为不相关的引用类型是否违反严格的别名规则?
- 特征:从数组类型中获取标量类型是否记录?