【问题标题】:Value-initialization of std::array inside std::unordered_map [duplicate]std::unordered_map 内 std::array 的值初始化 [重复]
【发布时间】:2020-10-20 17:21:05
【问题描述】:

考虑代码:

#include <unordered_map>
#include <array>
#include <iostream>
int main () {
        std::unordered_map<int, std::array<int, 5>> map;
        map[42][0] = 1;
        for (int i = 0; i < 5; i++) {
                std::cout << map[42][i] << " ";
        }
}

这会在我的系统上打印1 0 0 0 0std::map 中保存的 std::array 的内容在插入时进行了值初始化(即数组中的所有整数都设置为 0)。标准能保证这一点吗?我不应该期望用作地图值的数组包含垃圾?

【问题讨论】:

标签: c++ initialization


【解决方案1】:

operator [] 如果密钥不存在,则插入value_type(key, T())。这个函数相当于return insert(std::make_pair(key, T()))

T() 表示默认初始化

c++17 起 这个函数相当于返回this-&gt;try_emplace(key).first-&gt;second

emplace/try_emplace 在运算符 [] 的情况下构造默认初始化值

来自https://en.cppreference.com/w/cpp/container/map/operator_at

【讨论】:

  • 您引用的是参考文献的 pre-c++11 部分。虽然答案是一样的
  • @idclev463035818 谢谢。添加到答案中
  • 如果我正确理解有关 LWG 问题 2469 的说明,您首先拥有的实际上是已发布的 c++11 和 c++14 标准中的内容
  • 但是原始类型数组的默认初始化实际上并没有在内部提供默认初始化项。 std::array&lt;int, 5&gt; arr 会给出不确定的值。您必须对其进行零初始化
  • 这回答了我的问题,但是 T() 并不意味着默认初始化,它意味着值初始化,至少从 C++03 开始​​ (en.cppreference.com/w/cpp/language/value_initialization)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 2015-10-05
  • 1970-01-01
  • 2012-02-10
  • 2015-01-02
  • 1970-01-01
  • 2018-01-13
相关资源
最近更新 更多