给定以下基于共享指针容器的类,
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()
返回类型中移除Foo
的const
限定符可以解决这个问题。然而,我知道std::vector
将其const
传播到其元素,而boost::shared_ptr
没有对其所指向的对象进行这样的操作(自然而然)。因此,看起来getFoos()
不再观察其const
限定符(尽管编译器不会抱怨),因为客户端代码可以修改所返回的共享指针指向的Foo
对象。我正确吗?如果是这样,是否有一些方法可以编写
getFoos()
,以便它将返回一个常量引用的常量对象的常量向量,而无需复制?
Bar
的调用者在获取到该vector
的引用后会对其进行什么操作? - Mark B