5

我正在尝试在包含原子的地图中构造一个对象,因此它既不能复制也不能移动 AFAICT。

我对 C++参考的阅读是 mapemplace应该能够做到这一点。但是由于已删除或不存在构造函数,以下代码无法编译。使用make_pair没有帮助。

#include <atomic>
#include <unordered_map>

class Z {
  std::atomic<int> i;
};

std::unordered_map<int, Z> map;

void test(void) {
  map.emplace(0, Z()); // error
  map[0] = Z(); // error
}

这是可能的,如果没有,为什么不呢?

编辑:编译器是 gcc 4.8.1,在 Linux 上

4

3 回答 3

14

map.emplace(std::piecewise_construct, std::make_tuple(0), std::make_tuple())Z将在 location构造一个零参数0

map[0]如果它不存在,也会这样做。

emplace接受参数来构造 a std::pair<const K, V>std::pair有一个std::piecewise_construct_t带两个元组的标记构造函数,第一个用于构造第一个参数,第二个用于构造第二个参数。

so就地std::pair<const int, Z> test( std::piecewise_construct, std::make_tuple(0), std::make_tuple() )构造s 元素,使用. 是用构造的。testconst int(0)Z()

map.emplaceforwards 是std::pair构造函数的参数。

于 2015-10-29T19:39:52.667 回答
2

最简单的解决方案是使用operator[]在地图内部构造值。然后您可以分配一个值(或根据需要对其进行操作)。

于 2015-10-29T19:41:32.093 回答
-1

可能以下解决方案会更好,因为 atomic 不可复制:

class Z {
  std::atomic<int> i;
};

std::unordered_map<int, std::shared_ptr<Z>> map;

void test(void) {
  map.emplace(0, std::make_shared<Z>()); // OK
}
于 2015-10-29T19:52:16.163 回答