无序列图会创建一个零初始化结构吗?

Will an unordered map create a zero initialized struct?

本文关键字:一个 初始化 结构 创建 无序      更新时间:2023-10-16

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

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

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

相关文章: C++ 结构有默认构造函数吗?

不,这不是巧合,是的,映射创建了一个零初始化结构。但是,让我们通过细节:

映射中的新元素是使用值初始化创建的;本质上是使用::new (address) T()之类的东西。没有用户定义的默认构造函数(如TestStruct)的类的值初始化意味着该对象为零初始化,因此所有非静态成员都是零初始化的。

从 [dcl.init]p8:

对 T 类型的对象进行值初始化意味着:[...] 如果T是没有用户提供或删除的默认构造函数的 [...] 类类型,则对象初始化为零 [...]

从 [dcl.init]p6:

对 T 类型的对象或引用进行零初始化意味着:[...] 如果T是 [...] 类类型,则其填充位 (6.7) 初始化为零位 以及每个非静态数据成员、每个非虚拟基类子对象,以及(如果该对象不是基对象) 类子对象,每个虚拟基类子对象都是零初始化的 [...]

但是,如果您的类具有用户定义的默认构造函数,则值初始化将导致调用该构造函数。因此,您的int确实是零初始化的,但这只是因为您拥有特别简单的类。