gpt4 book ai didi

c++ - 如果绝对没有调用成员函数,是否允许具有不完整类型的 vector ?如果有,从什么时候开始?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:50:48 27 4
gpt4 key购买 nike

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

// in foo.hh
struct Hidden;

我想用作 std::vector 的元素类型。使用 union 我可以将对 std::vector 的构造函数和析构函数的调用“推迟”到 union 构造函数/析构函数的实现.

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

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

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

背景:Question that came up in my answer to another question .

最佳答案

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

[vector.overview]/3 An incomplete type T may be used when instantiating vector if the allocator satisfies the allocator completeness requirements 17.6.3.5.1. T shall be complete before any member of the resulting specialization of vector is referenced.

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

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

关于c++ - 如果绝对没有调用成员函数,是否允许具有不完整类型的 vector ?如果有,从什么时候开始?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44664807/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com