4

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

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()能够修改任何内容。

从返回类型中删除限定符可以解决此问题const。但是,我知道虽然将它的常量传播到它的元素,但它(自然地)指向的对象并没有做这样的事情。因此,在我看来,它不再遵守它的限定符(即使编译器没有抱怨),因为客户端代码可以修改返回的共享指针指向的对象。FoogetFoos()std::vectorboost::shared_ptrgetFoos()constFoo

我对么?如果是这样,是否有某种方法可以编写getFoos(),以便它将 const 引用的 const 向量返回到 const 对象而无需复制?

4

3 回答 3

3

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

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

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

在这里,您试图获得vector<shared_ptr<Foo>>const vector<shared_ptr<const Foo>>.

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

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

于 2012-11-19T23:36:08.083 回答
2

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

您想要在 a 上执行的大多数操作const vector都可以在 a rangeof random-access上执行const_iterator

于 2012-11-20T18:14:51.957 回答
0

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

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

于 2012-11-20T00:00:23.827 回答