[英]Vector(array) of atomic variables
我知道atomic的副本構造函數已被刪除,但是我該怎么做才能使此代碼起作用? 如何在vector中為atomic定義一個拷貝構造函數?
#include <atomic>
#include <vector>
int main() {
std::vector<std::atomic<int>> examp;
examp.resize(64);
}
您無法擁有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';
}
std::atomic
不可復制或移動。 如您所述,復制構造函數被刪除,但是沒有生成移動構造函數。 參見http://en.cppreference.com/w/cpp/language/move_constructor :
如果沒有為類類型(struct,class或union)提供用戶定義的move構造函數,則以下所有條件均成立:
- 沒有用戶聲明的副本構造函數;
用戶聲明的意思是“未由編譯器添加”(即default
)。 即使它是一個庫類,構造函數也是由用戶聲明的。
向量的resize
功能需要根據重載類型將其移動插入或復制插入。 參見http://en.cppreference.com/w/cpp/container/vector/resize :
如果當前大小小於計數,
1)附加了其他默認插入的元素
2)附加附加值的副本
您正在做的事情根本行不通。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.