【问题标题】:atomic - Deleted Copy Constructor [duplicate]atomic - 已删除的复制构造函数
【发布时间】:2016-10-06 18:36:37
【问题描述】:

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

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 方式)。我尝试显式分配给向量元素,但即使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;
    }
};

是否有任何破解方法或指针是唯一的选择?

谢谢。

【问题讨论】:

  • 为什么不arr(size, init)
  • emplace_back 就地构造项目。不幸的是,由于可能需要重新分配,它还要求 T 是 MoveInsertable,而原子不能满足这些要求。

标签: c++ vector stdatomic


【解决方案1】:

你可以这样做

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

Demo

【讨论】:

  • 是的,它有效。但同样,最初需要的不是初始化。可以避免这种显式分配吗?
猜你喜欢
  • 2022-01-22
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
相关资源
最近更新 更多