我有unordered_map,其键值对分别为string和aClass类型; aClass不能移动的地方(它有一个互斥体)。我也不希望它被复制构造。我认为复制构造一个包含互斥量的类不是明智的。 为了将项目的构建延迟到插入地图之前,我尝试使用emplace将其插入地图,因此,第二个参数必须为空:
aList.emplace("aString");
但是,前一行无效。 有任何想法如何使用默认构造函数放置吗? 我也尝试过:
aList.emplace("aString", void);
aList.emplace("aString", {});
aList.emplace(std::piecewise_construct,"aString");
谢谢
答案 0 :(得分:2)
一种解决方案是使用std::unordered_map<>::operator[]
,它使用默认构造函数创建新元素:
auto& element = m["aString"]; // Creates a new element or gets an existing one.
或者,如果不需要返回值:
static_cast<void>(m["aString"]);
答案 1 :(得分:2)
如果您有权使用C ++ 17,则可以使用try_emplace
:
myMap.try_emplace("someKey");
这将默认使用键“ someKey”构造一个新元素。
在C ++ 17之前,您可以使用std::pair
的{{1}}构造函数和值为值参数的空元组来使用emplace
:
std::piecewise_construct