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

3

我是C++的新手,经过大量阅读有关移动语义、唯一指针(和初始化列表)的知识后,我明白了为什么这段代码行不通(抛出“试图引用已删除函数”的错误):

term_array::term_array(std::unique_ptr<term>&& opd) 
    : term(std::vector<std::unique_ptr<term>> {std::move(opd)}) {...}

这是一个构造函数,旨在从派生类term_array传递一个指向term对象的指针opd到基类term中,其中term构造函数需要一个指针向量。因此,我尝试即时创建一个std::vector<std::unique_ptr<term>>并用从term_array构造函数接收的一个opd指针填充它。显然,这不起作用,因为unique_ptr无法被复制,并且initializer_list初始化不允许移动操作。

我在this question中看到如何在常规程序流中“列出移动类型的向量”。但是,在简单的构造函数调用内是否可以完成这个操作?还是我完全偏离了轨道?


1
也许你应该少担心移动语义和独特指针,多关注在C++中编写有用的应用程序。你已经做到了吗? - user2100815
这就是我想做的。我想编写一个小程序来评估算术表达式。term 应该是一个操作的抽象基类,保存操作数(terms 本身)的向量,因此使用了 unique_ptr 向量。派生类应该实现加、减、乘等实际的各种行为。这种方法是否不好? - Duke
1个回答

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

还在努力弄清楚这个问题...你能告诉我为什么要调用函数SingletonVector吗?我没有看到一个“单例”(就我所知)被涉及到。我也不明白为什么要使用std::decay_t - x不是一个右值引用吗,所以根据C++参考 ,衰减应该没有影响吧? - Duke
1
@Duke 单例模式是包含一个元素的集合。 x 是一个转发引用,因此如果传递了一个左值,则可以推断出 T 为左值引用。decay_t 用于删除 T 可能携带的引用和任何 cv 限定符。 - Brian Bi
1
非常感谢!对于这些愚蠢的问题我很抱歉...从Java转到C++确实有些困难...我甚至不确定unique_ptr是否是我想要做的最佳指针类型。这一切似乎都很笨拙... - Duke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接