20

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

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

例如,它确实会阻止构建递归数据结构。

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

4

1 回答 1

19

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

经过更多的测试,我们发现即使是 [简单] 示例也无法与每个 STL 实现一起使用。到头来,这一切都显得太模糊,太不了解;标准化委员会认为除了说 STL 容器不应该与不完整的类型一起使用之外,别无选择。为了更好地衡量,我们也将该禁令应用于标准库的其余部分。

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

在同一篇文章中,他承认

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

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

编辑:有关将 C++17 标准允许的不完整类型用于标准 C++ 库中的某些容器的信息,请参阅此答案。

于 2013-09-07T10:28:13.583 回答