C++11:用 atomic<bool> 成员编写 move 构造函数?

标签 c++ c++11 atomic move-semantics libstdc++

我有一个带有原子成员变量的类:

struct Foo
{
  std::atomic<bool> bar;
  /* ... lots of other stuff, not relevant here ... */
  Foo() 
  : bar( false )
  {}

  /* Trivial implementation fails in gcc 4.7 with:
   *   error: use of deleted function ‘std::atomic<bool>::atomic(const td::atomic<bool>&)’
   */
  Foo( Foo&& other )
  : bar( other.bar )
  {}
};

Foo f;
Foo f2(std::move(f));  // use the move

move 构造函数应该是什么样子的?

Gcc 4.7 不喜欢我的任何尝试(比如在 other.bar 周围添加 std::move()),而且这里的网络出奇地安静。 ..

最佳答案

std::atomic 不可复制或 move ,因为 its copy constructor is deleted并且没有定义 move 构造函数。您必须显式加载另一个值并使用它来构造新值,正如 gustaf 的回答中所指出的那样。

为什么 std::atomic 不可 move ?由于它是一个同步原语,所有线程必须同步相同的数据(即相同的地址)。当你复制(或 move )一个原子值时,你必须使用一些通信协议(protocol)。它可能很简单,就像在您的示例中一样(只需加载它并使用它来初始化新的原子),但总的来说,我认为 C++11 强制您考虑它是一个很好的设计决策。否则,可能会导致代码看起来不错,但存在一些细微的同步问题。

关于C++11:用 atomic<bool> 成员编写 move 构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14182258/

相关文章:

c++ - 基于区间的数据结构(类似于boost icl)

c++ - 未找到共享对象但存在于链接器目录中

c++ - 在没有 <'typename' 的情况下调用模板函数 >

c++ - SFINAE 方法在 clang 中完全禁用基类的模板方法

c++ - 如何用sfinae检查,type是否有operator()?

c++ - boost::detail::atomic_count 线程安全吗?

c++ - sig_atomic_t 和 std::atomic<> 可以互换吗?

c++ - 为什么不考虑特定值的模板?

c++ - 如果成员具有非平凡的 noexcept 赋值运算符,则默认 move 赋值不能显式地为 noexcept

c - C 中的原子读取