众所周知,通常不能用不完整的类型实例化C ++标准库容器。这样做的结果是UB,尽管在实践中给定的实现将接受没有问题的代码或发出编译错误。有关此限制的讨论可以在这里找到:Why C++ containers don't allow incomplete types?
但是,在C ++ 17中,存在三个明确允许不完整类型的容器:std::forward_list
(26.3.9.1/4)、std::list
(26.3.10.1/4)和{{ 1}}(26.3.11.1/4)。
这是N4510的结果。该文件指出,“根据伊萨夸会议的讨论”,决定至少在最初将这种支持限制在这三个集装箱内。但是为什么呢?
答案 0 :(得分:1)
因为我们知道如何实现这些容器以处理不完整的类型,而又不会破坏ABI。
另一方面, std::array
需要知道元素的大小。
答案 1 :(得分:1)
但是为什么?
标准容器中不允许使用不完整类型的原因是某些容器可以使用它们,而有些容器则不能。他们当时不想对此问题考虑太多,因此全面禁止所有标准容器中的不完整类型。
马特·奥斯汀(Matt Austern)在他的精彩文章“标准图书馆员:不完整类型的容器”中作了记录,该文章不再可用,但在Boost Containers of Incomplete Types中仍然有引用。
此C ++ 17更改通过消除该全面禁止所造成的伤害来实现正义。