对map :: emplace的语法感到困惑

时间:2013-10-17 17:18:07

标签: c++ c++11 stl

鉴于

std::map<int, int> myMap;

以下哪项陈述

myMap.emplace(1, 2);
myMap.emplace({1, 2});
myMap.emplace(std::make_pair<int,int>(1,2));

是有效的,为什么?在我看来,如果第三个({} s)确实应该有效。

1 个答案:

答案 0 :(得分:5)

myMap.emplace(1,2);无效,对我来说效果很好。

myMap.emplace({1,2});无效,因为emplace 转发它是用于就地创建对象而不是获取value_type类型的对象的参数(来自地图)本身作为一个论点。由于它没有获取目标类型的对象(std::pair),因此编译器无法使用初始化列表来创建该对象。

如果通过直接调用std::pair来构建emplace,则根本不会从emplace中受益,而且它的存在将毫无意义。

myMap.emplace(std::make_pair<int,int>(1,2));有效,但可能不是您想要的。你想要

myMap.insert(std::make_pair(1,2));

myMap.insert(decltype(myMap)::value_type(1,2));

emplace在您已有std::pair时不会带来任何好处。