众所周知,通常情况下,C++标准库容器无法与不完整类型一起实例化。这样做的结果是未定义行为,尽管在实践中,给定的实现将接受代码而没有问题,或者发出编译错误。有关此限制的讨论可以在这里找到:为什么C ++容器不允许不完整类型?
但是,在C++17中,有三个容器明确允许不完整类型:
这是N4510的结果。该文件指出,“基于Issaquah会议上的讨论”,决定首先将此支持限制在这三个容器中。但是为什么呢?
std::forward_list
(26.3.9.1/4),std::list
(26.3.10.1/4)和std::vector
(26.3.11.1/4)。这是N4510的结果。该文件指出,“基于Issaquah会议上的讨论”,决定首先将此支持限制在这三个容器中。但是为什么呢?
std::forward_list
和std::list
允许这样做,因为它们的节点可以通过值存储对象。我猜想 在引用列表的任何成员之前,T 必须是完整的类型。"fixes" 这个问题。 - NathanOliverstd::deque
有什么看法?我认为deque
并不需要提前完整的类型,因为它本质上是list
和vector
的混合体。 - user7860670