c++ - 为什么 STL 数据结构需要完全定义的类型

标签 c++ stl undefined-behavior

在寻找 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 实现进行编译,但如果可以编译,您可以确定它可以正常工作?

最佳答案

简短的回答是:因为标准是这么说的。更普遍, 取决于实现,以及每种类型和功能的作用, 实例化一个模板可能需要一个完整的定义。作者们 标准的人不想,或者没有时间分析 并详细说明在什么情况下他们不想要求完整 定义,并达成一揽子声明。还要注意,当 标准写好了,经验相对较少 STL,可以肯定的是没有一些巧妙的优化 这将需要类中参数类型的实例; 与其冒着禁止这种优化的风险,这样做似乎更安全 需要一个完整的类型。

关于c++ - 为什么 STL 数据结构需要完全定义的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8473455/

相关文章:

c++ - 静态库的 undefined reference 和奇怪的内容

c++ - 如何正确 "perfect forward"getter 函数?

c++ - 现代编译器能否展开使用开始和结束迭代器表示的 `for` 循环

c++ - 如何将 std::transform 与模板一起使用

c - 通过显式算术计算元素指针是否有效?

c - offsetof 的这种实现是否会调用未定义的行为?

c++ - Comeau vs g++ [又一个错误]

c++ - 使用 C++ 中的 Eigen 库定义和填充稀疏矩阵

c++ - 如何使 map::find 操作不区分大小写?

调用不带参数的带参数的C函数