在寻找this question的解决方案时,我找到了这个thread on another forum,它说标准要求完全定义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;
}
或者这是其中一个问题,这些代码可能无法使用某些STL实现进行编译,但是如果它编译了,您可以确定它有效吗?
答案 0 :(得分:5)
简短的回答是:因为标准是这样说的。更普遍, 取决于实现,以及每种类型和功能的作用, 实例化模板可能需要完整的定义。作者 标准要么不想要,要么没时间分析 并详细说明他们不希望完成的情况 定义,并以一揽子陈述结算。还要注意什么时候 标准是写的,经验相对较少 STL,可以肯定的是没有一些聪明的优化 这将需要一个类中的参数类型的实例; 而不是冒险禁止这样的优化,它似乎更安全 需要一个完整的类型。
答案 1 :(得分:1)
编译器面对不完整类型的至少一个问题是它可能无法完全确定 struct Test 的大小。因此,某个容器如何在内部实例化 Test ?
实际上,正如詹姆斯所说,这取决于std :: map模板如何使用第二个类型参数。只要它不使用实例但 Test 指针它应该编译。 但谁可以为所有STL-(或一般来说,容器 - )实现声称这个? 由于STL是编译器套件的一部分,因此一个潜在危险会降低代码的可移植性。