std::unordered_map访问不存在的键时是否会创建零初始化结构体?
关于std::unordered_map自动创建零初始化结构体的疑问解答
你用std::unordered_map<int, TestStruct>时,通过map[1]访问不存在的键,得到的test.a等于0,担心这是巧合?完全不是,这是C++标准明确定义的行为,咱们来掰扯清楚:
- 首先说
std::unordered_map的operator[]:当你访问的键在容器里不存在时,它会自动插入一个新元素,然后返回这个元素的引用。这个新元素的初始化方式是值初始化。 - 再看你的
TestStruct:因为你没有给它显式定义任何构造函数,编译器会自动生成一个默认无参构造函数。而对于这种没有用户自定义构造函数的结构体,值初始化会把所有内置类型的成员(比如这里的int a)都零初始化。
举个反例你就更清楚了:如果给结构体加一个显式的空构造函数,像这样:
struct TestStruct { int a; TestStruct() {} // 显式定义空构造 };
这时候operator[]创建的新元素里,a就不会被零初始化了,它的值会是未定义的——因为显式构造函数覆盖了编译器生成的版本,而你没在构造函数里给a赋值。
回到你的代码,test.a == 0是标准规定的必然结果,绝对不是巧合。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

