#include <set>#include <vector>#include <memory>class C {};int main(){ std::set<std::unique_ptr<const C>> s; std::vector<std::unique_ptr<const C>> v; std::move(s.begin(),s.end(),std::back_inserter(v));}
这会在VS2017上出现以下错误:
error C2280: ‘std::unique_ptr>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)’: attempting to reference a deleted function
我们不能从std :: set中将迭代器移动到非const变量吗?什么可以解决这个问题?
解决方法 为了从集合中提取仅移动元素,唯一的可能性是使用在C 17中添加的extract
方法: while (!s.empty()) v.emplace_back(std::move(s.extract(s.begin()).value());
如果你不能使用C 17,只有当你确保它在强加的顺序中保持相同的位置时才允许修改集合的元素(例如使用mutable) – 也就是说,只要它在你的下面具有相同的结果与该集合中的所有其他成员进行比较时的比较器.您可以通过提供一个比较器来执行此 *** 作,该比较器在非空之前对空的唯一指针进行排序(请注意,标准不保证这一点)并在修改后立即擦除修改后的元素:
template<class T> struct MutableWrapper { mutable T value; };template<class T> struct MutableWrapperCompare { bool operator()(MutableWrapper<T> const& lhs,MutableWrapper<T> const& rhs) { return lhs.value && rhs.value ? lhs.value < rhs.value : rhs.value; }};int main(){ std::set<MutableWrapper<std::unique_ptr<const C>>,MutableWrapperCompare<std::unique_ptr<const C>>> s; std::vector<std::unique_ptr<const C>> v; while (!s.empty()) { v.emplace_back(std::move(s.begin()->value)); s.erase(s.begin()); }}
然而,这是相当丑陋和危险的;你最好使用Boost.Container中的boost :: container :: set,它具有C 17提取方法(since 1.62.0;它是was undocumented,但这只是一个疏忽,请注意相应的提取方法是为map和multimap记录的).
总结以上是内存溢出为你收集整理的c – 从std :: set中提取move only类型全部内容,希望文章能够帮你解决c – 从std :: set中提取move only类型所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)