如果绝对没有调用成员函数,是否允许使用不完整类型的向量?如果是这样,从什么时候开始
Is a vector with incomplete type allowed if absolutely no member functions are called? If so, since when?
>假设我有一些不完整的类型
// 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++吗?如果是这样,从什么时候开始?
背景:我在回答另一个问题时提出的问题。
实例化具有不完整类型T
的std::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 之前,仅包含标头就已经触发了未定义的行为。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 如果可推导类型上有替换,可变参数模板类型推导会使编译器崩溃
- C++如果采用类类型的函数被传递派生类型,有没有办法给出错误?
- 如果用户不小心给出了不正确的数据类型,cin 如何工作?
- 如果原型是本地的,则使用流 I/O C++类型约束将失败
- 如果 lambda 没有指定的类型,std::function 如何接受 lambda?
- 使用用户定义的类型 UDT 实例化 std::atomic<>。如果 UDT 具有虚函数,则 l 墨水将失败。为什么?
- 实例化具有不完整类型的类模板格式不正确(如果该类型是在之后定义的)
- 如果类型来自 std,是否可以创建一个特征来回答
- 为什么是如果(类型汽车!= 'X' ||"S" ||'L') 的评估值始终为真
- 如果类型(不)相等,是否可以C++有条件地编译代码?
- 如果类型相同,对象地址必须不同,但如果类型不同,地址可以相同
- 如果类型需要模板,如何存储std ::向量
- QMetaObject::newInstance 如果类型在命名空间中失败
- 如果类型是noexex,则C++ 11 STL中的哪些算法和容器可以运行得更快
- C搜索字符串如果类型字符,int类型,操作符类型
- 如果类型的大小大于X,如何实现接受类型并评估引用的类型特征
- 如果类型在声明之前被引用,如何在Xtext IDE中显示错误
- 如果类型是派生类型,则C++调用特定的函数