【问题标题】:How do you create a std::pair containing a std::atomic?如何创建包含 std::atomic 的 std::pair?
【发布时间】:2019-08-11 17:39:16
【问题描述】:

我不知道如何创建以下内容:

std::pair<std::atomic<bool>, int>

我总是得到

/usr/include/c++/5.5.0/bits/stl_pair.h:139:45:错误:使用已删除的函数'std::atomic::atomic(const std::atomic&)'
: 第一个(__x), 第二个(std::forward<_u2>(__y)) { }

我试过了

std::pair<std::atomic<bool>, int> pair = std::make_pair(true, 1); //doesn't work
std::pair<std::atomic<bool>, int> pair = std::make_pair({true}, 1); //doesn't work
std::pair<std::atomic<bool>, int> pair = std::make_pair(std::atomic<bool>(true), 1); //doesn't work
std::pair<std::atomic<bool>, int> pair = std::make_pair(std::move(std::atomic<bool>(true)), 1); //doesn't work

我知道 std::atomic 是不可复制的,那么你应该如何成对创建它?这是不可能的吗?

【问题讨论】:

  • 你是在 C++17 模式下编译,还是更早的?
  • {std::piecewise_construct, std::make_tuple(true), std::make_tuple(1)} 用于复制初始化上下文
  • 我正在用 c++14 编译
  • @PiotrSkotnicki 你知道如何使用 std::vector 吗?例如。我有一个原子向量,我想把一个放在后面。由于编译器错误,我不能这样做: std::vector<:atomic>> atomics; atomics.emplace_back(true);

标签: c++ std atomic std-pair stdatomic


【解决方案1】:

你可以这样做:

std::pair<std::atomic<bool>, int> p(true, 1);

这使用true 来初始化原子第一个成员,没有任何无关的复制或移动。在 C++17 中,保证复制省略还允许您编写:

auto p = std::pair<std::atomic<bool>, int>(true, 1);

【讨论】:

  • 我无法访问 C++17,所以我没有尝试过第二个选项,但不幸的是,第一个选项对我不起作用。我得到 /usr/include/c++/5.5.0/bits/stl_pair.h:139:45: error: use of deleted function 'std::atomic::atomic(const std::atomic& )' : first(__x), second(std::forward<_u2>(__y)) { }
  • @RickD 这对我来说似乎是一个错误。我不知道您的stl_pair.h 版本是什么样的,但我猜想选择了错误的构造函数。要解决此问题,您可以尝试 cmets 中提到的 piecewise_construct 技术。
  • @RickD 好像是在here 引入了这个bug 并修复了here;不幸的是,我猜它没有进入 5.5.0 版本。
  • 啊,真不幸。我知道这必须是可能的,感谢您对此的跟进。我想我会将此标记为已解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-12
  • 2011-10-29
  • 2015-08-25
  • 1970-01-01
相关资源
最近更新 更多