C++ std::无序映射初始化

C++ std::无序映射初始化,c++,std,unordered-map,C++,Std,Unordered Map,当我第一次访问中的元素时,它将自动创建。对其初始化有什么保证(如果有)?(保证是值初始化,还是仅构造) 例如: std::unordered_map<void *, size_t> size; char *test = new char[10]; size[test] += 10; std::无序地图大小; 字符*测试=新字符[10]; 尺寸[试验]+=10; 在该序列结束时,尺寸[测试]是否保证为10 在该序列结束时,尺寸[测试]是否保证为10 对。 在代码的最后一行中,siz

当我第一次访问中的元素时,它将自动创建。对其初始化有什么保证(如果有)?(保证是值初始化,还是仅构造)

例如:

std::unordered_map<void *, size_t> size;
char *test = new char[10];
size[test] += 10;
std::无序地图大小;
字符*测试=新字符[10];
尺寸[试验]+=10;
在该序列结束时,尺寸[测试]是否保证为10

在该序列结束时,尺寸[测试]是否保证为10

对。 在代码的最后一行中,
size[test]
value将元素初始化为
T()
,或者在本例中是
size\u T()

C++11 23.4.4.3映射元素访问[map.access]

T&operator[](常量键&u类型&x)

1效果:如果地图中没有与x等价的键,则将值类型(x,T())插入地图

至于
T()
,确切的语言有点复杂,因此我将尝试引用相关的部分:

C++11 8.5.16初始值设定项的语义如下所示

-如果初始值设定项为(),则对象的值已初始化。


8.5.7对值进行初始化类型为T的对象表示:

-如果T是(可能是cv限定的)类类型

-如果T是(可能是cv限定的)非并集类类型

-如果T是数组类型,则每个元素都初始化为值

-否则,对象初始化为零。


8.5.5至零初始化类型为T的对象或参考表示:

-如果T是标量类型(3.9),将对象设置为值0(零),作为整型常量表达式,转换为T


有什么区别?类类型对象的值初始化需要默认构造,因此答案是“两者都有”。对于映射
,将使用
V()
初始化新对象


所有标准容器都使用值或直接初始化(后者可能通过副本构造)初始化新元素。新的标准容器元素不可能处于“未初始化”状态(即没有默认初始化元素的机制)。

我已经阅读了文档的这部分内容,但我不确定其含义。对于像size\u t这样的整数类型,“默认构造”是什么意思?(你能引用一个标准吗?@Suma:integral类型不是类类型,所以它们没有构造函数。初始化这些类型的值等于零初始化。(第8章)KerrekSB:你确定你不把C++和java混淆吗?内置的构造不默认为零。@spraff:值初始化需要归零,标准保证在这里初始化值。通常,内置容器保持原样,但在STL容器的特殊情况下,它们是值初始化的。同样,你应该调用
std::vector v(10)您将获得10个零。@spraff:值初始化在C++03中是新的(C++98中的少数更改之一)。我假设“构造”的含义类似于在类中使用int成员变量时,默认的类构造函数不会初始化值。我想你是对的,但是值初始化是由“默认构造”短语保证的吗?如果V是吊舱呢?它是默认构造的(即未初始化的)还是值初始化的?@Suma:
V
是值初始化的,所以如果
V
是基本的,它是零初始化的,如果它是类类型,它是默认构造的。对于复合类型,可以递归地应用规则。