返回一个指向常量对象的常量共享指针的常量向量。

5

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

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_成员需要指向Bar对象内部使用的可变Foo对象,但我不希望客户端调用getFoos()能够修改任何内容。
getFoos()返回类型中移除Fooconst限定符可以解决这个问题。然而,我知道std::vector将其const传播到其元素,而boost::shared_ptr没有对其所指向的对象进行这样的操作(自然而然)。因此,看起来getFoos()不再观察其const限定符(尽管编译器不会抱怨),因为客户端代码可以修改所返回的共享指针指向的Foo对象。
我正确吗?如果是这样,是否有一些方法可以编写getFoos(),以便它将返回一个常量引用的常量对象的常量向量,而无需复制?

Bar 的调用者在获取到该 vector 的引用后会对其进行什么操作? - Mark B
它应该对其元素执行只读操作(或更准确地说,对其元素指向的对象执行只读操作)。 - ezod
3个回答

3
我可能错了,但我真的不认为你能实现这个功能。
通过创建指向`shared_ptr`的新实例,`shared_ptr`可以成为`shared_ptr`。
对于`shared_ptr`的引用不能成为`shared_ptr`的引用,因为它们是两种不同类型。
在这里,您试图将对`vector>`的引用转换为`const vector>`的形式。
第一个`const`是完全可以的,因为使用const限定符将引用分配给相同引用类型是可以的。
但第二个`const`不行,因为您正在尝试将对`Type A`向量的引用转换为对`Type B`向量的引用。

2
而不是返回std::vector<...> const&,是否考虑返回一个range呢? range是一对某种迭代器的pair。 在这种情况下,您的迭代器将为std::shared_ptr<const foo>。 您可以通过编写快速迭代器适配器来执行此操作,该适配器在内部迭代const_iteratorstd::shared_ptr<foo>,但将它们作为std::shared_ptr<const foo>返回。
大多数您想要在const vector上执行的操作都可以在随机访问const_iteratorrange上执行。

0

你可以返回一个const shared_ptr<Foo>*指针,而不是一个vector,并使用显式的丑陋的C风格转换将foos_.data()转换为任何你想要的类型。

既然你想要返回一个const vector,那么通过返回指针你并没有失去太多,当然除了大小信息。你总是可以将新指针包装在一个专门提供此大小信息的类中,在其创建时提供。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接