当我首次使用 std::unordered_map 的 operator [] 访问元素 时,它会自动创建。关于其初始化,有哪些保证 (如果有的话)? (保证进行值初始化,还是只保证构造?)
示例:
std::unordered_map<void *, size_t> size;
char *test = new char[10];
size[test] += 10;
在这个序列的结尾,size [test]是否保证为10?
当我首次使用 std::unordered_map 的 operator [] 访问元素 时,它会自动创建。关于其初始化,有哪些保证 (如果有的话)? (保证进行值初始化,还是只保证构造?)
示例:
std::unordered_map<void *, size_t> size;
char *test = new char[10];
size[test] += 10;
在这个序列的结尾,size [test]是否保证为10?
有什么区别?类类型对象的值初始化涉及默认构造,因此答案是“两者都是”。对于一个映射 <K, V>
,新对象将用 V()
初始化。
所有标准容器都使用值初始化或直接初始化来初始化新元素(后者可能通过复制构造实现)。新的标准容器元素不可能处于“未初始化”状态(即没有机制可以进行默认初始化元素)。
V
是值初始化,所以如果V
是基本类型,它将被零初始化;如果它是类类型,则会进行默认构造。对于复合类型,您需要递归地应用这些规则。 - Kerrek SB
std::vector<int> v(10);
,你将获得10个零。 - Matthieu M.