1

给定

std::map<int, int> myMap;

以下哪项陈述

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

是有效的,为什么?在我看来,{}如果第三个确实如此,那么第二个(带 s)肯定会起作用。

4

1 回答 1

5

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

myMap.emplace({1,2});无效,因为emplace 转发它的参数以就地创建对象,而不是将类型的对象value_type(来自地图)本身作为参数。由于它没有获取目标类型的对象 (the 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.

于 2013-10-17T17:33:47.787 回答