C++ 如何创建不可复制元素的容器

C++ 如何创建不可复制元素的容器,c++,stl,containers,noncopyable,C++,Stl,Containers,Noncopyable,有没有办法将STL容器与不可复制的元素一起使用 大概是这样的: class noncopyable { noncopyable(noncopyable&); const noncopyable& operator=(noncopyable&); public: noncopyable(){}; }; int main() { list<noncopyable> MyList; //error C2248: 'noncopyab

有没有办法将STL容器与不可复制的元素一起使用

大概是这样的:

class noncopyable
{
    noncopyable(noncopyable&);
    const noncopyable& operator=(noncopyable&);
public:
    noncopyable(){};
};

int main()
{
    list<noncopyable> MyList; //error C2248: 'noncopyable::noncopyable' : cannot access private member declared in class 'noncopyable'
}
类不可复制
{
不可复制(不可复制&);
常量不可复制&运算符=(不可复制&);
公众:
不可复制(){};
};
int main()
{
list MyList;//错误C2248:'noncopyable::noncopyable':无法访问在类'noncopyable'中声明的私有成员
}

一个选项是创建指向元素的指针列表(最好是共享的\u ptr)。这并不完全是你想要的,但它会完成工作

>不,非可复制元素不能在C++容器类中。


根据标准23.1第3段,“存储在这些组件中的对象类型必须满足
可复制
类型(20.1.3)的要求,以及
可分配
类型的附加要求。”

另一种选择是使用。如果可能的话,它的行为很像std::auto_ptrs的标准容器:它保留其元素的独占所有权,并且不能复制。它的开销也比标准的共享容器小。

+1,或多或少是唯一的选项,因为IIRC
std::list
要求元素是可复制的。这正是我试图避免的,我有时想调用MyList.clear(),我需要调用不可复制的析构函数。是的-标准说:“存储在这些组件中的对象类型必须满足可复制类型(20.1.3)的要求,以及可分配类型的附加要求。“@Vargas-似乎
shared\u ptr
会做你想做的事。所有容器都要求包含的类型是可复制的。共享的_ptr将自动进行内存管理,这样您就可以调用clear()来满足您的需要。这一点很好!如果他使用一个新的C++ STL编译器,那么我必须通过移除对象的复杂的深层拷贝需求来解决我的问题。我选择这个答案是因为它直接回答了我的问题。但是另一个也很好!如果这些是需求,为什么可以在向量或列表中存储唯一的_ptr?unique_ptr不可复制构造。注意:当在C++11中引入移动语义时,这就成为可能。看见