为什么C ++ Map的[]运算符调用映射值的默认构造函数?

时间:2014-11-19 22:55:09

标签: c++ map

我使用g ++编译了以下代码,在执行该行时将调用构造函数A():

m["1"]

为什么会这样?我没有看到在这里调用构造函数的必要性。

struct A
{
   int mem;
   A(int arg){}
   A(){}
};
int main()
{
   unordered_map<string, A> m;
   m["1"]; // will call A(), but why?
   m.find("1")->second; // will not call A()
}

1 个答案:

答案 0 :(得分:3)

这是operator[]的设计。如果他没有找到您正在查看的值,则使用默认构造函数创建该条目。

如果您想要查看某个元素是否存在而无需创建它,则可以使用find()代替。

如果你想像operator[]那样处理一个元素,但是如果找不到元素而不是创建缺少的条目则抛出异常,你会更喜欢at()