c++11 - 用原子 array 初始化类或者结构

  显示原文与译文双语对照的内容

如何编写类/结构的用户定义的复制构造函数( 带有原子变量的array )? 例如下面的代码不编译


struct foo
{ 
 std::array<std::atomic_int,3> a;
 foo() = default;
 foo(const int& i, const int& j, const int& k):a{{i,j,k}}{}
}

原因是: 声明在这里 __atomic_base ( const __atomic_base& ) = 删除;"换句话说,this在原子类型的定义中删除。 如果它不是原子的,它就会被 done 。

有什么方法可以做到这一点?

我在这里讨论了 C++ - 如何初始化原子的array? 。

时间: 作者:

std::atomic 复制构造函数被删除,因为无法将该值从一个对象复制到另一个对象:


std::atomic<int> a, b;
a = b;//use of deleted function 'std::atomic<int>& std::atomic<int>::operator=(const std::atomic<int>&)'

然而,你可以从一个原子读取值,然后将读取的内容存储到另一个原子中。


std::atomic<int> a, b;
a = b.load();

你可以使用a 循环以这种方式复制原子的array:


std::array<std::atomic<int>, 3> a, b;
for (const auto& i : b) {
 a = i.load();
}

或者- 避免显式循环- 转换:


std::array<std::atomic<int>, 3> a, b;
std::transform(begin(b), end(b), begin(a),
 [](int i){return i;});

因此,我将实现你的复制构造函数,如下所示:


foo(const foo& other) {
 std::transform(begin(other.a), end(other.a), begin(a),
 [](int i){return i;});
}

作者:

手动定义复制构造函数,并在构造函数( 如果应该被复制)的主体中按元素复制 array 元素。 请注意这不是原子。

作者:
...