给出以下基于共享指针容器的类,
\n\nclass 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\ninvalid 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()
能够修改任何内容。
const
从返回类型Foo
中删除限定符getFoos()
可以解决此问题。但是,我知道虽然std::vector
将其常量传播到其元素,但boost::shared_ptr
对其指向的对象(自然)没有这样做。因此,在我看来,似乎getFoos()
不再观察它的const
限定符(即使编译器没有抱怨),因为客户端代码可以修改Foo
返回的共享指针指向的对象。
我对么?如果是这样,是否有某种方法可以编写getFoos()
,以便它返回 const 对象的 const …