这是不关于将std :: auto_ptr放入std :: vector的问题。
在std::auto_ptr
,std::
或std::tr1::
中是否存在等同于boost::
的向量?我在函数参数中使用std::auto_ptr
并将值返回到这些函数的decalre所有权语义。但是这样我只能传递单个对象。作为向量的临时解决方案,我有这个:
std::auto_ptr<std::vector<std::tr1::shared_ptr<ClassExample> > > fx(....);
我认为,通过引入提升,我将能够改为:
std::auto_ptr<std::vectro<boost::unique_ptr<ClassExample> > >f(...);
为了定义严格的所有权传递,但似乎相当复杂。为了简化它,我可以使用
std::vector<boost::unique_ptr<ClassExample> > f(...);
因为矢量的深层副本的价格不高,但我仍然很好奇是否有可以像这样使用的东西:
auto_vector<ClassExample> f(...);
意味着该函数释放所有对象的所有权,并且不会深深复制向量内部数据数组。
答案 0 :(得分:4)
有一个C ++ 11解决方案 - 它需要一个提供r值引用的实现,并且已更新标准库以包含移动构造函数和std::unique_ptr
。
只需返回std::vector<std::unique_ptr<T>>
- 无法复制,因为std::unique_ptr<T>
不可复制。编译器将在返回时使用移动构造函数,它不会调用深层副本,也不会应用RVO并忽略构造新对象。
答案 1 :(得分:3)
没有任何特殊原因,为什么你需要维护一个指针向量,第一个解决方案是抛弃所有的复杂性,并为简单起见:
std::vector<Type> f();
对象的所有权是唯一(向量拥有它们),而代码看起来就像它在返回时复制向量一样,它将是{{3}在大多数情况下。
如果需要由于某些其他要求而动态分配向量内的对象(对象必须通过工厂分配,它们是派生类型的指针,或者它们不能移动由于向量增长 - 代码维护引用/指针)你没有显示然后我会去boost::ptr_vector
,它将保持所包含对象的所有权。再次,按价值返回:
boost::ptr_vector<Type> f();