本文介绍了std :: map emplace失败,使用显式构造函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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失败,使用显式构造函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-12 19:06