C++ std::无序映射运算符[]是否对不存在的键进行零初始化?

C++ std::无序映射运算符[]是否对不存在的键进行零初始化?,c++,unordered-map,zero-initialization,C++,Unordered Map,Zero Initialization,根据cppreference.com,对于不存在的值,初始化为零 但是,同一个站点没有提到的零初始化,只是它有一个依赖于此的示例 当然,这只是一个参考网站,不是标准。那么,下面的代码是否正确 #包括 int main(){ std::无序地图; 返回映射[42];//是否保证返回0? } 在您链接的网站上,它说: 当使用默认分配器时,这将导致密钥被复制 由键和正在初始化的映射值构造 因此,int是: 值初始化的效果是: [……] 4) 否则,对象初始化为零 这就是为什么结果是0取决于我们讨论的重

根据cppreference.com,对于不存在的值,初始化为零

但是,同一个站点没有提到的零初始化,只是它有一个依赖于此的示例

当然,这只是一个参考网站,不是标准。那么,下面的代码是否正确

#包括
int main(){
std::无序地图;
返回映射[42];//是否保证返回0?
}

在您链接的网站上,它说:

当使用默认分配器时,这将导致密钥被复制 由键和正在初始化的映射值构造

因此,
int
是:

值初始化的效果是:

[……]

4) 否则,对象初始化为零


这就是为什么结果是
0

取决于我们讨论的重载,
std::unordered\u map::operator[]
等效于

(获取右值引用的重载只会将
k
移动到
try\u emplace
中,并且在其他方面是相同的)

如果映射中键
k
下存在元素,则
try\u emplace
将迭代器返回到该元素,并
false
。否则,
try\u emplace
在键
k
下插入一个新元素,并返回该元素的迭代器和
true

模板
配对试装(常数键类型和k、参数和…参数);
我们感兴趣的是还没有元素的情况:

否则,插入一个类型为
value\uuuType
的对象,该对象由
分段构造、前向数组(k)、前向数组(std)构成​::​向前,这告诉我们新的map元素将被构造为:

pair(分段构造、前向元组(k)、前向元组(std​::​forward是使用
()
作为初始化器直接初始化类型为
T
的值,该初始化器可归结为值初始化。
int
的值初始化是零初始化。
int
的零初始化自然将
int
初始化为0


所以,是的,你的代码保证返回0…

@Ælex你不能可靠地测试某个东西是否初始化@Ælex我真的不明白,你怎么能有一个未初始化的
std::optional
?@Ælex没有办法测试对象是否初始化,因为除了初始化r以外的未初始化对象上的任何操作结果是未定义的行为。
std::optional
对象没有包含任何值,仍然是一个初始化对象。value对象是值初始化的,而不是零初始化的。对于标量类型,它们是相同的,但对于类类型,它们是不同的。@bolov我昨天尝试使用gnu 17和std 17测试它,奇怪的是,我得到了所有这些是零初始化。我以为
std::optional
有\u值
会测试它,但失败了,所以我想你是对的。
T& operator[](const key_type& k)
{
    return try_­emplace(k).first->second;
}