我有一个类似
的功能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
引用,导致错误。
答案 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)
来强制构建向量内部。