【发布时间】:2020-01-14 14:09:37
【问题描述】:
众所周知,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) 和 std::vector (26.3. 11.1/4)。
这是N4510 的结果。该文件指出,“基于对伊萨夸会议的讨论”,决定至少在开始时将此类支持限制在这三个集装箱上。但为什么呢?
【问题讨论】:
-
那些容器只需要一个指向所存储对象类型的指针。对于指向类型的指针,您不需要完整的定义。
-
我真的很惊讶
std::forward_list和std::list允许它,因为它们的节点可以按值存储对象。我想 T 应该在引用生成的列表专业化的任何成员之前完成。“修复”。 -
@Someprogrammerdude
std::deque怎么样?我认为deque没有任何理由要求提前完成类型,因为它本质上是list和vector的混合体。