作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
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
以上来自video大卫·斯通。我不明白的是为什么 emplace_back
调用显式构造函数?我在 C++ 标准中看不到任何内容使这合法。只有在听了 David Stone 的 youtube 视频后,我发现了这件事。
现在,我对 std::map
进行同样的尝试。
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
不做同样的事情?
最佳答案
emplace
方法通过使用 placement new operator
显式调用构造函数来插入元素。在放置到 map 中时,您需要单独转发参数来构造键和值。
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
);
关于c++ - std::map emplace 因显式构造函数而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43434691/
我是一名优秀的程序员,十分优秀!