在构造函数中用 C++ 中的 unique_ptr 初始化向量
Initialize a vector with unique_ptr in C++ within constructor
我是 C++ 的新手,在阅读了很多关于移动语义和唯一指针(以及初始化列表)的内容之后,我明白了为什么这段代码不起作用(抛出 "attempting to reference a deleted function"):
term_array::term_array(std::unique_ptr<term>&& opd)
: term(std::vector<std::unique_ptr<term>> {std::move(opd)}) {...}
它是一个构造函数,旨在将指针 opd
(指向 term
对象)从派生 class term_array
传递到基 class term
,其中 term
构造函数需要一个 向量 或指针。因此,我尝试动态创建一个 std::vector<std::unique_ptr<term>>
并用从 term_array
构造函数接收到的一个 opd
指针填充它。显然,这不起作用,因为无法复制 unique_ptr
,并且 initializer_list
初始化不允许移动操作。
我在 this question 中看到如何在常规程序流程中 "list-initialize a vector of move-only type"(意思是当您可以使用多行代码时)。但是(如何)这可以在一个简单的构造函数调用中完成?还是我完全偏离了轨道?
您可以使用辅助函数模板执行此操作:
template <class T>
auto SingletonVector(T&& x) {
std::vector<std::decay_t<T>> ret;
ret.push_back(std::forward<T>(x));
return ret;
}
然后:
term_array::term_array(std::unique_ptr<term>&& opd)
: term(SingletonVector(std::move(opd))) {...}
我是 C++ 的新手,在阅读了很多关于移动语义和唯一指针(以及初始化列表)的内容之后,我明白了为什么这段代码不起作用(抛出 "attempting to reference a deleted function"):
term_array::term_array(std::unique_ptr<term>&& opd)
: term(std::vector<std::unique_ptr<term>> {std::move(opd)}) {...}
它是一个构造函数,旨在将指针 opd
(指向 term
对象)从派生 class term_array
传递到基 class term
,其中 term
构造函数需要一个 向量 或指针。因此,我尝试动态创建一个 std::vector<std::unique_ptr<term>>
并用从 term_array
构造函数接收到的一个 opd
指针填充它。显然,这不起作用,因为无法复制 unique_ptr
,并且 initializer_list
初始化不允许移动操作。
我在 this question 中看到如何在常规程序流程中 "list-initialize a vector of move-only type"(意思是当您可以使用多行代码时)。但是(如何)这可以在一个简单的构造函数调用中完成?还是我完全偏离了轨道?
您可以使用辅助函数模板执行此操作:
template <class T>
auto SingletonVector(T&& x) {
std::vector<std::decay_t<T>> ret;
ret.push_back(std::forward<T>(x));
return ret;
}
然后:
term_array::term_array(std::unique_ptr<term>&& opd)
: term(SingletonVector(std::move(opd))) {...}