【问题标题】:Why do STL-Datastructures need fully defined types为什么 STL 数据结构需要完全定义的类型
【发布时间】:2011-12-12 11:15:55
【问题描述】:

在寻找this question 的解决方案时,我发现了这个thread on another forum,它表示该标准要求完全定义STL-Datastructure 的所有模板参数。这意味着生成一个在其自身内部存储其自身类型的元素的结构会调用未定义的行为。但是据我所知,大多数 C++11 之前的数据结构(即std::vectorstd::map 等)都没有发现这一点。

在 STL 数据结构中使用不完整类型实际上可能是什么问题?或者更确切地说,以下代码可能导致什么潜在危险:

#include <stdint.h>
#include <map>

struct Test {
  std::map<uint32_t, Test> m_map1;
};

int main() {
  return 1;
}

或者这是其中一个问题,该代码可能无法使用某些 STL 实现进行编译,但如果它确实编译,您可以确定它可以工作?

【问题讨论】:

  • Mathew Austern 提供了很好的解释here。如果总结并链接到文章,这很可能是一个答案。现在我有点忙于工作但有人可以随意这样做。

标签: c++ stl undefined-behavior


【解决方案1】:

简短的回答是:因为标准是这样说的。更普遍, 取决于实现,以及每种类型和功能的作用, 实例化模板可能需要完整的定义。作者 的标准要么不想,要么没有时间分析 并详细说明他们不想要求完成的情况 定义,并解决了一个笼统的声明。还要注意,当 标准写的,经验比较少 STL,并且可以肯定没有一些巧妙的优化 这将需要类中的参数类型的实例; 与其冒险禁止这种优化,倒不如 需要一个完整的类型。

【讨论】:

    【解决方案2】:

    对于不完整类型,您的编译器面临的至少一个问题是它可能无法完全确定您的 struct Test 的大小。因此,某些容器如何在内部实例化 Test

    实际上,正如 James 所说,这取决于 std::map 模板如何使用第二个类型参数。只要它不使用实例但 Test 指针它应该编译。 但是谁能为所有的 STL-(或者一般来说,Container-)实现声明这一点呢? 由于 STL 是编译器套件的一部分,因此潜在的危险会降低代码的可移植性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多