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

ezo*_*zod 5 c++ stl constants shared-ptr

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

\n\n
class Foo;\n\nclass Bar {\npublic:\n  // ...\n  const std::vector<boost::shared_ptr<const Foo> >& getFoos() const { return foos_; }\nprivate:\n  std::vector<boost::shared_ptr<Foo> > foos_;\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

这不会编译,因为

\n\n
invalid initialization of reference of type \xe2\x80\x98const std::vector<boost::shared_ptr<const Foo>, std::allocator<boost::shared_ptr<const Foo> > >&\xe2\x80\x99 from expression of type \xe2\x80\x98const std::vector<boost::shared_ptr<Foo>, std::allocator<boost::shared_ptr<Foo> > >\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

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

\n

Jim*_* Lu 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