用原子数组初始化一个类或结构

时间:2014-01-15 16:15:05

标签: arrays c++11 atomic copy-constructor initializer-list

如何使用原子变量数组编写类/结构的用户定义的复制构造函数?例如,以下代码无法编译

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;”即在原子类型的定义中将其删除。如果它不是原子的,那就完成了。

有没有办法做到这一点?

我在这里进行了讨论C++ - How to initialise an array of atomics?

2 个答案:

答案 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)

只需手动定义复制构造函数,然后在构造函数体中按元素复制数组元素(如果应该复制它)。请注意,这不是原子的。