【发布时间】:2016-04-12 19:44:06
【问题描述】:
我有一个函数,它接受一些对象向量并对其进行过滤,并且需要返回转换为基类的过滤后的对象向量。
class Base {
// stuff
}
class Derived : public Base {
// more stuff
}
// elsewhere...
vector<reference_wrapper<const unique_ptr<Base>>> do_something(const vector<unique_ptr<Derived>> &things) {
vector<reference_wrapper<const unique_ptr<Base>>> a;
for (const unique_ptr<Derived> &derived : things) {
if (check(derived)) {
a.push_back(derived); // this obviously doens't work -
// what should I put here?!
// this does not work:
// a.push_back(std::ref(derived.get()))
// because derived.get() is an rvalue
}
}
return a;
}
返回的向量不拥有任何原始对象 - 它们应该只是阅读器。原始对象的寿命将超过返回向量的寿命。
【问题讨论】:
-
你确定要
vector<reference_wrapper<const unique_ptr<Base>>>吗? -
除非返回的向量应该拥有对象,否则您应该只返回一个原始指针向量,而不是
unique_ptrs。据我所知,things应该保留对象的所有权。 -
@JoelCornett 这是个好主意吗?消费者不能随意“删除”指针吗?
-
@Charles 如果这是一个真正的问题,那么您应该将指针包装在一个自定义类中,以防止用户删除这些对象。您也可能希望通过
shared_ptr共享所有权。除非您将对象的所有权转移给调用者,否则您确实不想要unique_ptr。 -
@Charles 在新世界中,原始指针应该被视为由其他人拥有,任何人都不应该删除它们(除非他们碰巧正在编写 smart指针 或者,也许是一个容器类)。在大多数情况下,拨打
new和delete应该成为过去。
标签: c++ unique-ptr ownership