鉴于基于共享指针的容器下面的类,返回常量的常量矢量共享指针为const对象
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
将它的常量传播到它的元素,但boost::shared_ptr
不会对它指向的对象(自然地)做这样的事情。因此,在我看来getFoos()
不再遵守其const
限定符(即使编译器不抱怨),因为客户端代码可以修改返回的共享指针所指向的Foo
对象。
我正确吗?如果是这样,有没有办法写getFoos()
,这样它会返回一个const引用的常量向量到const对象而不进行复制?
一旦Bar的调用者获得了对它的引用,它会与'vector'一起做什么? –
它应该*对其元素(或者更精确地说,对其元素指向的对象)执行只读操作。 – ezod