无序映射会创建零初始化结构吗?

Will an unordered map create a zero initialized struct?

我有一个无序映射,它有一个 int 键和一个 struct 值。如果找不到密钥,我希望地图创建一个零初始化 struct.

struct TestStruct
{ 
   int a;
};

void foo()
{
   std::unordered_map<int, TestStruct> map;
   TestStruct& test = map[1];    
}

调试时我可以看到 test.a == 0 的值,但这是巧合吗?

相关post:Does a c++ struct have a default constructor?

不,这不是巧合,是的,地图创建了一个 zero-initialized 结构。但让我们来看看细节:

地图中的新元素是用value-initialization创建的;本质上是 ::new (address) T() 之类的东西。 class 的 Value-initialization 没有 user-defined 默认构造函数,例如您的 TestStruct 意味着对象是 zero-intialized,因此所有 non-static 成员都是 zero-initialized.

来自[dcl.init]p8

To value-initialize an object of type T means: [...] if T is a [...] class type without a user-provided or deleted default constructor, then the object is zero-initialized [...]

来自[dcl.init]p6

To zero-initialize an object or reference of type T means: [...] if T is a [...] class type, its padding bits (6.7) are initialized to zero bits and each non-static data member, each non-virtual base class subobject, and, if the object is not a base class subobject, each virtual base class subobject is zero-initialized [...]

但是如果您的 class 有一个 user-defined 默认构造函数,那么 value-initialization 将导致调用该构造函数。所以你的 int 确实是 zero-intitialized,但这只是因为你的 class 类型特别简单。