C++11中的std::map<K,V>
类型有一个emplace
函数,许多其他容器也有这个函数。
std::map<int,std::string> m;
std::string val {"hello"};
m.emplace(1, val);
这段代码的效果与广告宣传一致,可以直接放置std::pair<K,V>
,但它会导致复制key
和val
。
能否像将参数移动到emplace
调用中一样,直接将值类型放入映射中?我们能否做得更好?
这里是一个更详细的示例:
struct Foo
{
Foo(double d, string s) {}
Foo(const Foo&) = delete;
Foo(Foo&&) = delete;
}
map<int,Foo> m;
m.emplace(1, 2.3, string("hello")); // invalid
val
是左值,所以在某个时刻必须进行复制。 - juanchopanza