【发布时间】:2017-08-03 00:01:40
【问题描述】:
#include <iostream>
#include <map>
using namespace std;
struct FooStruct
{
int a;
int b;
};
int main()
{
map<int, FooStruct> fooMap;
fooMap.emplace<int, FooStruct>(0, {1, 2});
return 0;
}
在防止临时复制方面,以上是emplace的正确用法吗?上面的形式是不是比
fooMap.emplace(make_pair<int, FooStruct>(0, {1, 2}));
或者这些形式是否等效并且它们都避免创建FooStruct的临时副本?
【问题讨论】:
-
区别是
make_pair使用pair的移动构造函数语义,而其他方式调用模板的构造函数。 -
fooMap.emplace(std::piecewise_construct, std::forward_as_tuple(0), std::forward_as_tuple(1, 2));呢? -
@max66:你是说你的表格比上面提到的两个好?如果是这样,你能解释一下为什么会这样吗?
-
否;我只向您展示另一种方法来做同样的事情;如果我没记错的话,它(大致)与第一种形式相同,但不需要明确的模板类型(在某些情况下可能很好)。
-
@max66: +1 消除了指定模板类型的需要。
标签: c++11 stl containers emplace