为什么C++容器不允许不完整的类型?

Meh*_*dad 16 c++ templates stl incomplete-type

为什么 C++不允许实例化不完整类型的容器?

编写没有这个限制的容器当然是可能的 - boost :: container完全能够做到这一点.据我所知,它似乎没有给出任何性能或其他类型的增益,但标准声明它是未定义的行为.

例如,它确实阻止了构建递归数据结构.

为什么C++标准会强加这种任意限制呢?尽可能允许不完整类型作为模板参数的缺点是什么?

das*_*ght 16

C++标准化委员会图书馆工作组主席Matt Austern 根据历史原因在Dobb博士的文章中解释了委员会的这一决定:

我们通过更多测试发现,即使是[简单]示例也不适用于每个STL实现.最后,这一切看起来都太模糊,太难理解了; 标准化委员会认为没有任何选择,只是说STL容器不应该用于不完整类型.为了更好地衡量,我们也将禁令应用于标准库的其余部分.

我对此的理解是委员会不希望通过要求它们追溯地支持不完整类型来使库的现有实现无效.

在同一篇文章中,他承认这一点

在将来的C++版本中,放宽对不完整类型的标准库模板实例化的限制可能是有意义的.

鉴于该文章的历史可以追溯到2002年,并且禁令仍然存在于当前标准中,我认为提升设计者决定不等待未来并建立自己的容器以允许不完整的类型是完全合理的.

  • @Mehrdad标准委员会(与大多数委员会一样)在决策方面非常缓慢.有时,这是一件好事; 有时(我认为是C++标准库的情况)它太严格了.这篇文章的年代是一个很好的证明:这个限制现在应该已经解除了很长时间,至少在`std :: vector <T>`. (2认同)