You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:47:47