鑑於基於共享指針的容器下面的類,返回常量的常量矢量共享指針爲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