如何使用原子变量数组编写类/结构的用户定义的复制构造函数?例如,以下代码无法编译
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&amp;)= delete;”即在原子类型的定义中将其删除。如果它不是原子的,那就完成了。
有没有办法做到这一点?
答案 0 :(得分:1)
删除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();
您可以使用for循环以这种方式复制原子数组:
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;});
}
答案 1 :(得分:0)
只需手动定义复制构造函数,然后在构造函数体中按元素复制数组元素(如果应该复制它)。请注意,这不是原子的。