ezo*_*zod 5 c++ stl constants shared-ptr
给出以下基于共享指针容器的类,
\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};\nRun 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\nRun 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 引用的 const 向量而不进行复制?
我可能是错的,但我真的不认为你能实现这一目标。
shared_ptr<Foo>shared_ptr<const Foo>只能通过构建新实例才能成为shared_ptr<const Foo>
对 的引用shared_ptr<Foo>不能成为对 的引用shared_ptr<const Foo>,仅仅因为它们是两种不同的类型。
在这里,您试图以vector<shared_ptr<Foo>>的形式获取对 的引用const vector<shared_ptr<const Foo>>。
第一个const完全没问题。因为可以使用 const 限定符将引用分配给相同的引用类型。
但第二个const不是,因为您实际上是在尝试将对 向量的引用转换Type A为对 向量的引用Type B。
| 归档时间: |
|
| 查看次数: |
2493 次 |
| 最近记录: |