在容器之间移动std :: unique_ptr

时间:2014-06-11 23:22:45

标签: c++ set move unique-ptr

尝试在容器之间移动unique_ptrs时遇到了问题。我有一个std :: unordered_set被称为元素,其中包含一堆unique_ptrs。我想将其中一些移动到另一个名为subelements的unordered_set。我该怎么做?

这是我的功能:

void MeshContainer::MoveSubelements(){

  int mesh_dim = MeshDimension();

  for(auto el=elements.begin(); el!= elements.end(); ++el){
    if((*el)->getDim() != mesh_dim){
      subelements.insert(std::move(*el));
      elements.erase(*el);
    }
  }

}

使用上面的代码我得到以下编译器错误:

错误:使用已删除的函数'std :: unique_ptr< _Tp,_Dp> :: unique_ptr(const std :: unique_ptr< _Tp,_Dp>&)[with _Tp = MEl; _Dp = std :: default_delete]'

我认为问题必须与复制构造函数有关,但我认为使用std :: move会解决这个问题。

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

std::setstd::multiset仅提供 const 对其元素的访问权限。这意味着你不能移动一些东西。如果您可以移出项目(或根本不修改它们),您可以通过更改项目的排序顺序来中断该项目。所以C ++ 11禁止它。

因此,您尝试使用std::move算法只会调用复制构造函数。

将unique_ptrs放入一组后,它们就会卡住。

source谢谢dyp。