给定以下基于共享指针容器的类,
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
。但是,我知道虽然将它的常量传播到它的元素,但它(自然地)指向的对象并没有做这样的事情。因此,在我看来,它不再遵守它的限定符(即使编译器没有抱怨),因为客户端代码可以修改返回的共享指针指向的对象。Foo
getFoos()
std::vector
boost::shared_ptr
getFoos()
const
Foo
我对么?如果是这样,是否有某种方法可以编写getFoos()
,以便它将 const 引用的 const 向量返回到 const 对象而无需复制?