我使用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()
}
答案 0 :(得分:3)
这是operator[]
的设计。如果他没有找到您正在查看的值,则使用默认构造函数创建该条目。
如果您想要查看某个元素是否存在而无需创建它,则可以使用find()
代替。
如果你想像operator[]
那样处理一个元素,但是如果找不到元素而不是创建缺少的条目则抛出异常,你会更喜欢at()