2013-02-25 24 views
-3

这只是令人难以置信的是,标准库中没有任何东西允许存储不可复制对象的对象 - 我至少会遇到复制在所有时间都没有任何意义的情况(boost信号,opengl对象等)但另一方面,默认构造是合理的操作。出于某种原因,默认的答案似乎是使用指针而不是对象。最后,通过额外的间接引用和引用计数来引入无意义的开销(因为unique_ptr也是不可复制的),除此之外,使用起来有些尴尬。是否有任何提供就地构建集合的库?

这就是说,这样的替代方案存在吗?

+2

您能更清楚您的要求吗?因为标准库容器*允许存储不可复制的对象,所以我不知道你在说什么。 – 2013-02-25 21:25:59

+2

*并且*它们允许通过'emplace_ *'成员函数 – 2013-02-25 21:32:16

+0

@AndyProwl进行就地构建。但是它们需要copy_constructible用于许多操作(即映射中的[]运算符)。诚然,说他们不能被使用是夸张的,我不得不说你不希望单靠功能要求来使用它们。 – Cubic 2013-02-25 21:48:04

回答

3

从C++ 11开始,大多数(如果不是全部的话)容器不要求它们的元素是可复制的。例如,向量只需要元素是可移动的,而其他容器(deque,* list,* map,集合)没有可复制/可移动的元素要求。您需要默认构建元素,或者使用emplace方法来创建它们。当然,如果你调用需要复制/移动的操作,你的类型必须支持它,但只是将元素存储在容器中并不需要它们是可复制的。

+0

这实际上是我的问题。例如。使用没有[]运算符的地图是尴尬的。 – Cubic 2013-02-25 21:49:36

+1

@Cubic使用'std :: map :: at',使其不那么尴尬http://stackoverflow.com/a/13902825/893693 – inf 2013-02-25 21:53:49

相关问题