我有一个std::map
,其键为std::string
,值是我自己定义的类型。
假设我有以下代码:
std::map<std::string, MyType> mymap;
std::string str1("test");
MyType value(pars); //I want value to be moved
mymap.emplace(std::make_pair(str1, std::move(value))); //A
mymap.emplace(str, std::move(value)); //B
假设std::map
存储对,我猜A会生成对std::pair
构造函数(make_pair
)的进一步调用,然后再调用std::pair
移动构造函数(在 - 用rvalue参数放置构造。)
我认为B只会调用std::pair
构造函数。
为了避免不必要的构造,我们可以说B优于A吗?
答案 0 :(得分:1)
根据http://www.cplusplus.com/reference/map/map/emplace/:
如果新元素的键是唯一的,则在地图中插入新元素。使用args作为构造value_type(它是对类型的对象)的参数来构造这个新元素......通过调用带有args转发的allocator_traits :: construct来就地构造元素。
因此,在选项A中,您首先构造一对emplace
将转发给pair
的构造函数(作为右值),然后执行移动构造。
选项B转发str
并将std::move(value)
返回给构造函数以进行配对。
所以是的,选项A构造2对,而选项B只构造1。