C++ std::列表的类型要求

C++ std::列表的类型要求,c++,C++,我有一个无法移动或复制的类型(通过将必要的构造函数和运算符设为私有)。但是当我试图编译它们的std::list时,操作失败了,出现了一个非常奇怪的错误(为了简洁起见,截取了类名) 当然,链表中的一种类型不必是可移动的或可复制的 当这些成员被公开时,代码可以很好地编译——即使std::list试图访问它们,它也会是一个未解析的外部成员,因为它们只声明为私有。毫无意义:(从C++03开始,元素必须是可复制构造和可复制分配的。§23.1/3: 存储在这些组件中的对象类型必须满足可复制类型(20.1.3

我有一个无法移动或复制的类型(通过将必要的构造函数和运算符设为私有)。但是当我试图编译它们的std::list时,操作失败了,出现了一个非常奇怪的错误(为了简洁起见,截取了类名)


当然,链表中的一种类型不必是可移动的或可复制的


当这些成员被公开时,代码可以很好地编译——即使std::list试图访问它们,它也会是一个未解析的外部成员,因为它们只声明为私有。毫无意义:(

从C++03开始,元素必须是可复制构造和可复制分配的。§23.1/3:

存储在这些组件中的对象类型必须满足可复制类型(20.1.3)的要求,以及可分配类型的附加要求

在C++0x中,需求是基于每个操作的,但通常可以安全地说元素必须是可移动构造和可移动分配的(尽管有些操作需要复制构造和可分配等)


问题的典型解决方案是通过
shared\u ptr
或其他智能指针存储指向对象的指针。

标准容器需要其元素类型是可复制的,如果您有不可复制的类型,则使用(智能)指针作为元素类型(如:
std::list


模板类/函数通常会生成错误,除非您显式使用它们,因此可能是您没有错误。

但是如果它们是公共的,则代码不会生成错误。如果要求它们是可复制的,则应该生成错误,因为它们只声明了。@DeadMG,这是因为编译器省略了副本,因此不需要调用要定义的函数。它仍然必须是可访问的。这就解释了这一点。遗憾的是,我不能将注释标记为答案。“当然,链接列表中的某个类型不一定是可移动或可复制的。”那么它如何从列表外部获取值到列表内部?:)通过使用resize和default构造它们。我不知道为什么没有显式函数来添加默认构造的对象。因为,容器要求显式声明对象必须是可复制构造的,所以没有太多的理由麻烦使用它。
1>C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\xmemory(202)
: error C2248: 'T::T' : cannot access private member declared in class 'T'