是否可以将包含 unique_ptr 的对象存储在静态容器中?
Is it possible to store an object which contains a unique_ptr in a static container?
我想在静态容器中存储一个包含 unique_ptr 的对象:
Class A
{
public:
A() {}
~A() {}
private:
unique_ptr<int> p;
};
static vector<A> vec = { A() };
但是代码无法编译,因为 class 由于唯一的 ptr,A 不可复制。
我怎样才能解决这个问题,而不必在 class A 中定义一个复制构造函数来对指针执行移动操作?
如果你想防止A
类型的对象被复制,那么我看到的唯一方法是使用shared_ptr<A>
的向量。不确定这是否符合您的要求或意图,但至少它有效:
static vector<shared_ptr<A>> vec = { make_shared<A>() };
首先,通过定义析构函数,你将失去自动生成的移动构造函数。所以你要么必须删除它,要么定义一个合适的移动构造函数。然后,你可以像
一样简单地初始化它
static vector<A> vec(1);
不幸的是,它不会像写的那样编译。当列表初始化(使用 {...}
)一个 std::vector
时,调用的构造函数是带有 std::initializer_list
和 it doesn't allow move semantics.
的构造函数
有解决方法,但有点难看
static auto vec = []{
std::vector<A> vec;
vec.emplace_back();
return vec;
}();
我想在静态容器中存储一个包含 unique_ptr 的对象:
Class A
{
public:
A() {}
~A() {}
private:
unique_ptr<int> p;
};
static vector<A> vec = { A() };
但是代码无法编译,因为 class 由于唯一的 ptr,A 不可复制。 我怎样才能解决这个问题,而不必在 class A 中定义一个复制构造函数来对指针执行移动操作?
如果你想防止A
类型的对象被复制,那么我看到的唯一方法是使用shared_ptr<A>
的向量。不确定这是否符合您的要求或意图,但至少它有效:
static vector<shared_ptr<A>> vec = { make_shared<A>() };
首先,通过定义析构函数,你将失去自动生成的移动构造函数。所以你要么必须删除它,要么定义一个合适的移动构造函数。然后,你可以像
一样简单地初始化它static vector<A> vec(1);
不幸的是,它不会像写的那样编译。当列表初始化(使用 {...}
)一个 std::vector
时,调用的构造函数是带有 std::initializer_list
和 it doesn't allow move semantics.
有解决方法,但有点难看
static auto vec = []{
std::vector<A> vec;
vec.emplace_back();
return vec;
}();