如果绝对没有调用成员函数,是否允许使用不完整类型的向量?如果是这样,从什么时候开始

Is a vector with incomplete type allowed if absolutely no member functions are called? If so, since when?

本文关键字:如果 类型 向量 什么时候 开始 许使 调用 成员 是否 函数 用不完      更新时间:2023-10-16

>假设我有一些不完整的类型

// in foo.hh
struct Hidden;

我想用作std::vector的元素类型.使用union我可以"推迟"对构造函数的调用,并将std::vector的析构函数的调用"延迟"到联合构造函数/析构函数的实现。

// in foo.hh
struct Public {
  union Defer {
    std::vector<Hidden> v;
    Defer();
    // add copy/move constructor if needed
    ~Defer();
  } d;
};

现在,我可以通过仅包含foo.hh并与实现Public::Defer::Defer()Public::Defer::~Defer()的文件链接来使用Public。只有那些人需要访问Hidden的完整定义。

这是合法C++吗?如果是这样,从什么时候开始?

背景:我在回答另一个问题时提出的问题。

实例化具有不完整类型Tstd::vector<T>是未定义的行为,最多为 C++14。在 C++17 中,此限制有所放宽:

[vector.overview]/3 如果分配器满足分配器完整性,则在实例化vector时可以使用不完整的类型T 要求 17.6.3.5.1. 在引用由此产生的vector专业化的任何成员之前,T应完整。

(注意:默认分配器std::allocator确实满足这些完整性要求(。

我的理解是,对于 C++17,翻译单元包含您的标头(向前声明Hidden并定义Public的标头(并定义变量Public pub;是合法的 - 但实际上不能使用任何 pub.d.v 成员。在 C++17 之前,仅包含标头就已经触发了未定义的行为。

相关文章: