我知道atomic有一个被删除的拷贝构造函数,但我能做些什么来使这段代码工作?我怎样才能在vector中为原子定义一个复制构造函数?
#include <atomic>
#include <vector>
int main() {
std::vector<std::atomic<int>> examp;
examp.resize(64);
}
答案 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)附加额外的价值副本
你所做的只是简单地工作。