我有一个无序映射,它有一个 int
键和一个 struct
值。如果找不到 key ,我希望映射创建一个零初始化的 struct
。
struct TestStruct
{
int a;
};
void foo()
{
std::unordered_map<int, TestStruct> map;
TestStruct& test = map[1];
}
调试时我可以看到 test.a == 0
的值,但这是巧合吗?
最佳答案
不,这不是巧合,是的,映射创建了一个零初始化结构。但让我们来看看细节:
map 中的新元素是使用值初始化创建的;本质上是像 ::new (address) T()
这样的东西。没有用户定义的默认构造函数(例如 TestStruct
)的类的值初始化意味着该对象是零初始化的,因此所有非静态成员都是零初始化的。
来自 [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 [...]
但是如果您的类有一个用户定义的默认构造函数,那么值初始化将导致调用该构造函数。所以你的 int
确实是零初始化的,但这只是因为你拥有的类特别简单。
关于c++ - 无序映射会创建零初始化结构吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49418173/