无序映射会创建零初始化结构吗?
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 类型特别简单。
我有一个无序映射,它有一个 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 类型特别简单。