为什么C++容器不允许不完整类型? 为什么C++不允许实例化不完整类型的容器?< /P>
当然,可以编写不受此限制的容器—完全能够做到这一点。就我所见,它似乎没有提供任何性能或其他类型的增益,但标准声明它是未定义的行为 例如,它确实会阻止构建递归数据结构为什么C++容器不允许不完整类型? 为什么C++不允许实例化不完整类型的容器?< /P>,c++,templates,stl,incomplete-type,C++,Templates,Stl,Incomplete Type,当然,可以编写不受此限制的容器—完全能够做到这一点。就我所见,它似乎没有提供任何性能或其他类型的增益,但标准声明它是未定义的行为 例如,它确实会阻止构建递归数据结构 为什么C++标准会施加这种任意限制?什么可能是允许不完整类型作为模板参数的下端?(< /P> < P > Matt Austern,C++标准化委员会图书馆工作组主席),他以历史的原因解释了委员会的决定: 通过更多的测试,我们发现即使是[simple]示例也不能适用于所有STL实现。最后,这一切似乎太模糊,理解得太少;标准化委员会认
为什么C++标准会施加这种任意限制?什么可能是允许不完整类型作为模板参数的下端?(< /P> < P > Matt Austern,C++标准化委员会图书馆工作组主席),他以历史的原因解释了委员会的决定: 通过更多的测试,我们发现即使是[simple]示例也不能适用于所有STL实现。最后,这一切似乎太模糊,理解得太少;标准化委员会认为除了说STL容器不应该使用不完整的类型外,没有其他选择。为了更好的衡量,我们也将这一禁令应用于标准库的其余部分 我的理解是,委员会不希望通过要求库的现有实现追溯支持不完整类型而使其无效 在同一篇文章中,他承认
在C++的未来修订中,放宽对不完全类型的标准库模板的限制可能是有意义的。 考虑到这篇文章可以追溯到2002年,并且当前的标准中仍然存在禁令,我认为boost设计人员不等待未来并构建自己的允许不完整类型的容器的决定是完全合理的
编辑:查看关于C++ C++ 17标准中对标准C++库中某些容器使用的不完整类型的信息。因为容器,除非它们存储指针,需要它存储的对象类型的大小吗?为什么你认为它们不?我在C++11标准中找不到任何这样的限制。@ViktorSehr:除了数组之外,所有标准容器都直接存储指针,而不是对象;因此,在需要分配一个或多个对象之前,他们不需要类型完整。@MikeSeymour:因为C++11说,17.6.4.8其他函数。。。2.在以下情况下,效果未定义:。。。特别是-如果在实例化模板组件时将不完整的类型3.9用作模板参数,除非该组件特别允许。@n.m.如果不使迭代器无效,则不可能交换数组的元素。如果通过移动元素进行交换,迭代器将不再引用同一对象。而且,对于大多数容器来说,交换需要花费固定的时间,如果必须交换每个元素,这是不可能的。Boost现在已经实现了,这显然是可能的。你的最后一句话有些道理,但Dobbs博士的文章没有…@Mehrdad标准委员会,因为大多数委员会在做出决定时非常缓慢。有时候,这是一件好事;有时候,我认为C++标准库的情况太过严格了。这篇文章的时代就是一个很好的证明:这一限制应该取消很长一段时间了,至少在std::vector上是这样。我真的不认为它们太慢了。。。他们不想要求图书馆追溯性地支持这一观点是很奇怪的。毕竟这是一个新的C++标准——还有很多复杂的变化要添加;不添加这个有什么好处?@Mehrdad我认为这里唯一的好处是让一些现有的实现保持不变。特别是,我不认为有任何逻辑上的理由来禁止std::vector,因为在内部它几乎是一对指针;在这个转发声明和进一步定义结构R{int payload;V;};使用V=std::shared_ptr