为什么STL-Datastructures需要完全定义的类型

LiK*_*Kao 6 c++ stl undefined-behavior

在寻找这个问题的解决方案时,我在另一个论坛上找到了这个帖子,该论文说该标准要求完全定义STL-Datastructure的所有模板参数.这意味着生成一个结构,该结构在其自身内部存储其自身类型的元素,从而调用未定义的行为.但是据我所知,这是没有抓到最前的C++ 11数据结构(即std::vector,std::map等).

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

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

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

int main() {
  return 1;
}
Run Code Online (Sandbox Code Playgroud)

或者这是这些问题之一,这些代码可能无法使用某些STL实现编译,但如果它编译,您可以确定它有效吗?

Jam*_*nze 5

简短的回答是:因为标准是这样说的.更一般地,取决于实现以及每种类型和功能的作用,实例化模板可能需要完整的定义.该标准的作者要么不想,要么没有时间详细分析和详细说明他们不希望在什么情况下要求完整的定义,并且要求一揽子声明.还要注意,在编写标准时,对STL的经验相对较少,并且可以确定没有一些聪明的优化需要在类中使用参数类型的实例; 而不是冒着禁止这种优化的风险,要求一个完整的类型似乎更安全.