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

时间:2013-09-07 10:03:32

标签: c++ templates stl incomplete-type

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

编写没有此限制的容器肯定是可能 - boost::container完全有能力执行此操作。据我所知,它似乎没有给出任何性能或其他类型的增益,但标准声明它是未定义的行为。

阻止构建递归数据结构,例如。

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

1 个答案:

答案 0 :(得分:15)

C ++标准化委员会图书馆工作组主席Matt Austern根据历史原因在Dr. Dobb's article解释了委员会的这一决定:

  

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

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

在同一篇文章中他承认

  

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

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