我有一个带有原子成员变量的类:
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/