问题描述
class A {
public:
explicit A(int x) {}
};
vector<A> v;
v.push_back(1); // compiler error since no implicit constructor
v.emplace_back(1); // calls explicit constructor
以上内容来自。我无法理解的是为什么 emplace_back
将
称为显式构造函数?我没有在C ++标准中看到
成为合法的东西。仅在听了David Stone的youtube视频后,我才知道
。
The above is from a video by David Stone. What I fail to understand is why does emplace_back
callthe explicit constructor? I do not see anything in the C++ standard thatmakes this legit. Only after listening to David Stone's youtube video,I found out about this.
现在,我尝试使用 std进行相同操作:地图
。
map<int, A> m;
m.insert(pair<int, A>(1, 2)); // compiler error since no implicit constructor
m.emplace(1, 2); // compiler error since no implicit constructor
为什么 emplace
在这里失败?如果 emplace_back
可以调用显式
构造函数,为什么 emplace
不做同样的事情?
Why does emplace
fail here ? If emplace_back
can call explicitconstructor, why doesn't emplace
do the same ?
推荐答案
emplace
方法通过使用 placement显式调用构造函数来插入元素新操作符
。在嵌入地图时,您需要分别转发参数以构造键和值。
emplace
method inserts elements by explicitly calling constructor with placement new operator
. While emplacing into map you need separately forward arguments for constructing key and value.
m.emplace
(
::std::piecewise_construct // special to enable forwarding
, ::std::forward_as_tuple(1) // arguments for key constructor
, ::std::forward_as_tuple(2) // arguments for value constructor
);
这篇关于std :: map emplace失败,使用显式构造函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!