返回指向 const 对象的 const 共享指针的 const 向量
Return a const vector of const shared pointers to const objects
给定以下基于共享指针容器的类,
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()
的客户端代码能够修改任何内容。
从getFoos()
返回类型中的Foo
中删除const
限定符可解决此问题。然而,我知道,虽然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>
的引用。
在这里,您尝试以const vector<shared_ptr<const Foo>>
的形式获取对vector<shared_ptr<Foo>>
的引用。
第一个const
完全没问题。因为可以使用 const 限定符将引用分配给相同的引用类型。
但第二个const
不是,因为您实际上是在尝试将对Type A
向量的引用转换为对Type B
向量的引用。
与其返回一个std::vector<...> const&
,不如返回一个范围呢? 范围是某种迭代器pair
。 在这种情况下,您的迭代器将 std::shared_ptr<const foo>
. 您可以通过编写一个快速迭代器适配器来做到这一点,该适配器在内部迭代const_iterator
以std::shared_ptr<foo>
,但将它们作为std::shared_ptr<const foo>
返回。
您希望在const
vector
上执行的大多数操作都可以在随机访问const_iterator
range
上执行。
您可以返回 const shared_ptr<Foo>*
指针而不是向量,并使用显式丑陋的 C 样式转换将foos_.data()
转换为您想要的任何内容。
由于您对返回 const 向量感兴趣,因此返回指针不会造成太多损失,当然,大小调整信息除外。您始终可以将新指针包装在旨在提供此大小调整信息的类中,该类在创建时提供。