atomic - 已删除的复制构造函数

时间:2016-10-06 18:36:38

标签: c++ vector stdatomic

需要具有原子对象的数组作为其私有数据成员之一的类。

class A {
  vector<atomic<int>> arr;
  public:
    A(int size, int init) : arr(vector<atomic<int>>(size,init)) {} 
      // Error: Deleted 'atomic(const atomic&)' (GCC)
};

相当简单,删除了复制构造函数。我想要做的就是将arr中的每个条目初始化为init。我能够使用指针和动态分配来做到这一点。

class A {
  atomic<int> *arr;
  public:
    A(int size, int init) : arr(new atomic<int>[size]) {
      for (int i=0; i<size; ++i) arr[i]=init; // Not initialization, but works
    } 
};

但我想用矢量(C++ ish way)来做这件事。我尝试明确指定向量元素,但即使vector::resize()vector::push_back()也需要复制ctor。

class A {
  vector<atomic<int>> arr;
  public:
    A(int size, int init) { 
      arr.resize(size); // Error: Deleted 'atomic(const atomic&)' (GCC)
      for (int i=0; i<size; ++i) arr[i]=init;
    }
};

有没有可能的黑客攻击或指针一是唯一的选择?

谢谢。

1 个答案:

答案 0 :(得分:4)

你可以做

A(int size, int init) : arr(size)
{
    for (auto& e : arr) {
        e = init;
    }
}

Demo