原子变量的矢量(数组)

时间:2017-12-27 04:59:52

标签: c++ arrays vector atomic copy-constructor

我知道atomic有一个被删除的拷贝构造函数,但我能做些什么来使这段代码工作?我怎样才能在vector中为原子定义一个复制构造函数?

#include <atomic>
#include <vector>

int main() {
    std::vector<std::atomic<int>> examp;
    examp.resize(64);
}

2 个答案:

答案 0 :(得分:3)

你不能拥有std::atomic<int>的向量,因为它不是可复制的或可移动的,但你可以有一个到atomic<int>的unique_ptrs向量。如果你真的需要原子的运行时可变大小矢量,这可能是一个可行的选择。这是一个例子:

#include <iostream>
#include <atomic>
#include <vector>
#include <memory>

using namespace std;

int main() {
    std::vector<std::unique_ptr<std::atomic<int>>> examp;
    examp.resize(64);   // 64 default unique_ptrs; they point to nothing

    // init the vector with unique_ptrs that actually point to atomics
    for (auto& p : examp) {
        p = std::make_unique<std::atomic<int>>(0);   // init atomic ints to 0
    }

    // use it
    *examp[3] = 5;

    for (auto& p : examp) {
        cout << *p << ' ';
    }
    cout << '\n';
}

答案 1 :(得分:2)

std::atomic不可复制或移动。如您所述,复制构造函数已删除,但不会生成移动构造函数。见http://en.cppreference.com/w/cpp/language/move_constructor

  

如果没有为类类型提供用户定义的移动构造函数   (struct,class或union),以下所有内容均为真:

     
      
  • 没有用户声明的副本构造函数;
  •   

用户声明的手段&#34;未由编译器添加&#34; (即default)。即使它是一个库类,构造函数也是用户声明的。

向量的resize函数要求类型可移动插入或可复制插入,具体取决于过载。见http://en.cppreference.com/w/cpp/container/vector/resize

  

如果当前大小小于count,

     

1)附加其他默认插入元素

     

2)附加额外的价值副本

你所做的只是简单地工作。