【发布时间】:2011-08-18 10:00:58
【问题描述】:
这不是关于将 std::auto_ptr 放入 std::vector 的问题。
在std::、std::tr1:: 或boost:: 中是否存在与std::auto_ptr 等效的向量?我在函数参数中使用std::auto_ptr 并返回值来标记这些函数的所有权语义。但这样我只能传递单个对象。作为向量的临时解决方案,我有这个:
std::auto_ptr<std::vector<std::tr1::shared_ptr<ClassExample> > > fx(....);
我想,通过引入 boost,我将能够变成这样:
std::auto_ptr<std::vectro<boost::unique_ptr<ClassExample> > >f(...);
为了定义严格的所有权传递,但似乎相当复杂。为了简化它,我可以使用
std::vector<boost::unique_ptr<ClassExample> > f(...);
因为向量深拷贝的价格不高,但我还是很好奇有没有可以这样使用的东西:
auto_vector<ClassExample> f(...);
表示该函数正在释放所有对象的所有权,并且向量内部数据数组没有被深度复制。
【问题讨论】:
-
我认为这是“如果每个人都想要一个怎么办”的问题之一。如果
auto_vector,那么为什么不auto_deque、auto_set、shared_vector、unique_unordered_multiset,基本上是任何智能指针类型与任何类的任何组合。模板语法冗长,typedefs 可以帮助解决这个问题,但这通常是用户的问题。这甚至忽略了您希望auto_vector<ClassExample>专门包含unique_ptr而不是其他任何内容。 -
我认为你有一些假设是错误的,特别是大多数编译器将能够优化按值返回而不需要新对象,因此向量本身的动态分配是不必要的复杂性问题。
-
Joe:
unique_ptr在 tr1 中定义在哪里? -
你是对的,它只在 C++11 中。
unique_ptr在 tr1 中没有用,因为它需要 r 值引用才能工作。
标签: c++ memory-management vector