代码之家  ›  专栏  ›  技术社区  ›  Brian Bi

为什么只有这些C++标准库容器保证允许不完整的类型?

  •  3
  • Brian Bi  · 技术社区  · 6 年前

    众所周知,C++标准库容器一般不能用不完整的类型实例化。这样做的结果是UB,尽管在实践中,给定的实现要么接受没有问题的代码,要么发出编译错误。有关此限制的讨论可在此处找到: Why C++ containers don't allow incomplete types?

    但是,在C++17中,有三个容器显式允许不完整类型: std::forward_list std::list (26.3.10.1/4),以及 std::vector (26.3.11.1/4).

    这是由于 N4510 . 该文件指出,“根据对Issaquah会议的讨论”,作出的决定至少是首先将这种支持限于这三个集装箱。但是为什么呢?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Barry    6 年前

    因为我们知道如何实现这些容器来处理不完整的类型,而不破坏ABI。

    std::array 另一方面,需要知道元素有多大(例如)。

        2
  •  1
  •   Maxim Egorushkin    6 年前

    但是为什么呢?

    标准容器中不允许使用不完整类型的原因是有些容器可以使用它们,但有些容器不能。当时他们不想对这个问题考虑太多,并且全面禁止在所有标准容器中使用不完整的类型。

    马特·奥斯特恩(Matt Ostern)在其伟大的文章《标准图书馆员:不完整类型的容器》(The Standard Library:Containers of Complete Type)中记录了这一点,这篇文章已不再可用,但仍有引用 Boost Containers of Incomplete Types

    这一C++17更改通过消除全面禁止所造成的伤害来实现正义。