返回指向 const 对象的 const 共享指针的 const 向量



给定以下基于共享指针容器的类,

class Foo;
class Bar {
public:
  // ...
  const std::vector<boost::shared_ptr<const Foo> >& getFoos() const { return foos_; }
private:
  std::vector<boost::shared_ptr<Foo> > foos_;
};

这不会编译,因为

invalid initialization of reference of type ‘const std::vector<boost::shared_ptr<const Foo>, std::allocator<boost::shared_ptr<const Foo> > >&’ from expression of type ‘const std::vector<boost::shared_ptr<Foo>, std::allocator<boost::shared_ptr<Foo> > >’

foos_成员需要指向可变Foo对象以供Bar对象内部使用,但我不希望调用getFoos()的客户端代码能够修改任何内容。

getFoos()返回类型中的Foo中删除const限定符可解决此问题。然而,我知道,虽然std::vector将其恒定性传播到其元素,但boost::shared_ptr对它指向的对象(自然)没有这样的事情。因此,在我看来,getFoos()不再遵守其const限定符(即使编译器不抱怨),因为客户端代码可以修改返回的共享指针指向的Foo对象。

我说的对吗?如果是这样,有没有办法编写getFoos()以便它将返回对 const 对象的 const 引用的 const 向量,而无需复制?

我可能是错的,但我真的不认为你能做到这一点。

shared_ptr<Foo>只能通过构造一个新实例来成为shared_ptr<const Foo> shared_ptr<const Foo>

shared_ptr<Foo>的引用不能仅仅因为它们是两种不同的类型而成为对shared_ptr<const Foo>的引用。

在这里,您尝试以const vector<shared_ptr<const Foo>>的形式获取对vector<shared_ptr<Foo>>的引用。

第一个const完全没问题。因为可以使用 const 限定符将引用分配给相同的引用类型。

但第二个const不是,因为您实际上是在尝试将对Type A向量的引用转换为对Type B向量的引用。

与其返回一个std::vector<...> const&,不如返回一个范围呢? 范围是某种迭代器pair。 在这种情况下,您的迭代器将 std::shared_ptr<const foo> . 您可以通过编写一个快速迭代器适配器来做到这一点,该适配器在内部迭代const_iteratorstd::shared_ptr<foo>,但将它们作为std::shared_ptr<const foo>返回。

您希望在const vector上执行的大多数操作都可以在随机访问const_iterator range上执行。

您可以返回 const shared_ptr<Foo>* 指针而不是向量,并使用显式丑陋的 C 样式转换将foos_.data()转换为您想要的任何内容。

由于您对返回 const 向量感兴趣,因此返回指针不会造成太多损失,当然,大小调整信息除外。您始终可以将新指针包装在旨在提供此大小调整信息的类中,该类在创建时提供。

最新更新