我遇到了一个错误:在编译类似下面代码时,“std::__1::unique_ptr >”的不显式删除拷贝构造函数被调用。使用c++ -std=c++14 unique_ptr_vector.cpp -o main命令编译时出现。
这是一个简化版:
头文件 'my_header.h':
#include <iostream>
#include <string>
#include <memory>
#include <vector>
class A{
public:
A() : n(0) {}
A(int val) : n(val) {}
A(const A &rhs): n(rhs.n) {}
A(A &&rhs) : n(std::move(rhs.n)) {}
A& operator=(const A &rhs) { n = rhs.n; return *this; }
A& operator=(A &&rhs) { n = std::move(rhs.n); return *this; }
~A() {}
void print() const { std::cout << "class A: " << n << std::endl; }
private:
int n;
};
namespace {
std::vector<std::unique_ptr<A>> vecA = {
std::make_unique<A>(1),
std::make_unique<A>(2),
std::make_unique<A>(3),
std::make_unique<A>(4)
};
}
我的源文件是unique_ptr_vector.cpp
:
#include "my_header.h"
using namespace std;
int main()
{
for(const auto &ptrA : vecA){
ptrA->print();
}
return 0;
}
我需要为每个组件单独使用
push_back(std::make_unique<A>(<some_number>))
吗?还是有更好的方法在头文件中填充容器?总的来说,这是一个不好的主意吗?我看到过一些问题,比如这个,这个和这个。
我知道现在似乎不可能使用初始化列表。但是人们通常如何处理
container<unique_ptr>
?我应该避免在头文件中初始化它吗?
std::unique_ptr
是移动语义的,而std::initializer_list
构造函数会复制元素。恐怕你只能使用.push_back
方法了。 - DeiDei