【发布时间】:2013-12-29 21:40:28
【问题描述】:
我有一个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 移动构造函数(带有右值参数的就地构造)。
而且我认为 B 只会生成对 std::pair 构造函数的调用。
那么我们可以说 B 优于 A 以避免不必要的结构吗?
【问题讨论】:
-
你尝试过
std::pair的分段构造吗? -
不,这只会使我的问题复杂化。但也许有人想详细说明这一点。
-
我不确定分段构造在这里有什么帮助;我宁愿说
forward_as_tuple可以用来代替make_pair来防止对的移动构造。 -
@jbgs 你是对的,已修复。