我是C++新手,在阅读了很多关于移动语义和唯一指针(以及初始值设定项列表(的内容后,我明白了为什么这段代码不起作用(抛出"尝试引用已删除的函数"(:
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>>
,并用从term_array
构造函数接收的一个opd
指针填充它。显然,这是行不通的,因为无法复制unique_ptr
,并且initializer_list
初始化不允许移动操作。
我在这个问题中看到了如何在常规程序流中"列出仅移动类型的向量"(这意味着您可以使用几行代码时(。但是(如何(在一个简单的构造函数调用中做到这一点?还是我完全偏离了轨道?
您可以使用帮助程序函数模板执行此操作:
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))) {...}