unordered_map 放置默认构造函数

unordered_map emplace with default constructor

我有unordered_map,键值对类型分别是string和aClass;不能移动 aClass 的地方(它有一个互斥量)。我也不希望它是复制构造的;我认为复制构造一个包含互斥锁的 class 是不明智的。 为了延迟项目的构建直到它插入到地图中,我尝试使用 emplace 将它插入到地图中,因此,第二个参数必须为空:

aList.emplace("aString");

但是,上一行没有用。 任何想法如何使用默认构造函数来放置? 我也试过:

aList.emplace("aString", void);
aList.emplace("aString", {});
aList.emplace(std::piecewise_construct,"aString");

谢谢,

一种解决方案是使用 std::unordered_map<>::operator[],它使用默认构造函数创建新元素:

auto& element = m["aString"]; // Creates a new element or gets an existing one.

或者,如果不需要 return 值:

static_cast<void>(m["aString"]);

如果您可以访问 C++17,则可以使用 try_emplace:

myMap.try_emplace("someKey");

这将默认构造一个具有键 "someKey" 的新元素。

在 C++17 之前,您可以使用 emplace 使用 std::pairstd::piecewise_construct 构造函数和一个空元组作为值的参数:

myMap.emplace(std::piecewise_construct,
              std::forward_as_tuple("someKey"),
              std::tuple<>{});