标准容器中的不完整类型实例化
在 C 中,像 std::vector 和 std::map 这样的容器允许实例化容器不完整的类型。这种做法通常用于通过自引用类型创建递归结构。然而,C 标准提出了是否允许此类实例化的问题。
根据 C 11 标准的 §17.6.4.8,如果未明确允许,不完整的类型实例化可能会导致未定义的行为。某些容器(例如 std::vector)可以适当地处理不完整类型,因为它们不具有通过值与 value_type 对象交互的 value_type 成员或函数。然而,std::map 在这方面表现出有问题的行为。
该标准的目的是禁止不完整的类型实例化,即使特定的实现可能不会遇到问题。这主要是由于潜在的实现困难,例如针对固定数量的元素优化 std::vector,如果允许递归结构,则可能会中断。
因此,该标准强制要求对容器使用完整类型实例化。然而,它承认创建显式支持不完整类型的自定义类模板的可能性,如 std::unique_ptr 所示。
因此,标准容器不应该用不完整类型实例化,尽管允许设计适应这种用法的自定义类模板。
以上是不完整类型可以在标准容器中实例化吗?的详细内容。更多信息请关注PHP中文网其他相关文章!