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

时间:2018-05-30 22:37:44

标签: c++ smart-pointers initializer-list

我是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对象)传递给基类termterm构造函数需要向量或指针的位置。因此,我尝试动态创建std::vector<std::unique_ptr<term>>并使用从opd构造函数接收的一个term_array指针填充它。显然,这不起作用,因为unique_ptr无法复制,initializer_list初始化不允许移动操作。

我在this question中看到如何&#34;列表初始化一个仅移动类型的矢量&#34;在常规程序流程中(意味着当您可以使用多行代码时)。但是(如何)可以在一个简单的构造函数调用中完成?还是我完全偏离轨道?

1 个答案:

答案 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))) {...}