为什么 C++ 不允许实例化不完整类型的容器?
当然可以编写没有此限制的容器 -- boost::container 完全能够做到这一点。据我所见,它似乎并没有给出任何性能或其他类型的收益,然而标准却将其定义为未定义行为。
它确实防止递归数据结构的建立,例如。
那么为什么C++标准会强制施加这种武断的限制呢?允许在可能的情况下将不完整类型作为模板参数会有什么缺点吗?
为什么 C++ 不允许实例化不完整类型的容器?
当然可以编写没有此限制的容器 -- boost::container 完全能够做到这一点。据我所见,它似乎并没有给出任何性能或其他类型的收益,然而标准却将其定义为未定义行为。
它确实防止递归数据结构的建立,例如。
那么为什么C++标准会强制施加这种武断的限制呢?允许在可能的情况下将不完整类型作为模板参数会有什么缺点吗?
编辑:请参阅此答案,了解在标准C++库中使用C++17标准允许的不完整类型的一些容器的信息。
std::vector<T>
上,这种限制早就应该被取消了。 - Sergey Kalinichenkostd::vector
,因为在内部它基本上就是一对指针。 - Sergey Kalinichenkostruct R { int payload; V v; };
之间使用不完整类型struct R;
,并且将using V = std::shared_ptr< std::vector< R > >;
用作其类型,那么它是否仍然是未定义行为?如果是,那么在定义递归的struct
时,我应该始终使用原生指针吗? - Tomilov Anatoliy
array
之外,所有标准容器都(直接)存储指针,而不是对象;因此,在需要分配一个或多个对象之前,它们不应该需要完整的类型。 - Mike Seymourswap
需要在常数时间内完成,如果必须交换每个元素,则这是不可能的。 - Mike Seymour