我是C ++的新手,在阅读了关于移动语义和唯一指针(以及初始化列表)的A LOT之后,我明白为什么这段代码无法工作(抛出"尝试引用已删除的函数& #34):
term_array::term_array(std::unique_ptr<term>&& opd)
: term(std::vector<std::unique_ptr<term>> {std::move(opd)}) {...}
它是一个构造函数,旨在将派生类opd
上的指针term
(指向term_array
对象)传递给基类term
, term
构造函数需要向量或指针的位置。因此,我尝试动态创建std::vector<std::unique_ptr<term>>
并使用从opd
构造函数接收的一个term_array
指针填充它。显然,这不起作用,因为unique_ptr
无法复制,initializer_list
初始化不允许移动操作。
我在this question中看到如何&#34;列表初始化一个仅移动类型的矢量&#34;在常规程序流程中(意味着当您可以使用多行代码时)。但是(如何)可以在一个简单的构造函数调用中完成?还是我完全偏离轨道?
答案 0 :(得分:3)
您可以使用辅助函数模板执行此操作:
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))) {...}