push_back(move(struct.unique_ptr))导致编译错误

时间:2015-07-10 12:03:31

标签: c++ struct unique-ptr

我有一个类似

的功能
for (auto&& i : v) {
    ...
    this->fifoQueue.push_back(move(i.p));
    ...
}

其中fifoQueue的类型为vector<unique_ptr<T> >v的类型为vector<struct s>struct s

struct s {
    ...
    std::unique_ptr<T> p;
    ...
};

语句this->fifoQueue.push_back(move(i.p));导致编译器错误“... error: declared here unique_ptr(const unique_ptr&) = delete; ...”。这句话怎么了?

我有另一个基本相同的工作语句,除了该语句类似于this->fifoQueue.push_back(move(p))。那么i.p是邪恶的吗?或auto&&

更新

正如Petr推断,v确实是const引用,导致错误。

2 个答案:

答案 0 :(得分:3)

(扩展我的评论)

您的错误消息unique_ptr(const unique_ptr&)似乎表明i.p变为const,因此push_back必须制作副本(或者事实上std::move必须制作副本,请参阅this answer)。但是,unique_ptr不能构建为const unique_ptr&的副本,因为鉴于unique_ptr的性质,这绝对是毫无意义的。所以你应该看看它来自const的位置。

我认为这个const的最可能来源是来自v,因为你没有向我们展示这个声明。

答案 1 :(得分:0)

如上所述,似乎编译器想要制作结构的副本。因为这里面unique_ptr不能。

当你想到它时,请注意这里的auto是什么意思?它将yourStruct &而不是yourStruct,因为您实际上可以修改此vector中的结构。由reference collapsing导致您yourStruct & auto && push_back

总而言之,不要考虑如何使用emplace_back来避免这种情况,而只需使用(Gather Streams)来强制构建向量内部。