在构造函数中C++中初始化unique_ptr向量



我是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))) {...}

最新更新