C++ 返回指向常量对象的常量共享指针的常量向量
给定以下基于共享指针容器的类C++ 返回指向常量对象的常量共享指针的常量向量,c++,stl,constants,shared-ptr,C++,Stl,Constants,Shared Ptr,给定以下基于共享指针容器的类 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_; }; Foo类; 分类栏{ 公众: // ...
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_;
};
Foo类;
分类栏{
公众:
// ...
const std::vector&getFoos()const{return foos_;}
私人:
std::向量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> > >’
从'const std::vector'类型的表达式初始化'const std::vector&'类型的引用无效
foos
成员需要指向可变的Foo
对象,供Bar
对象内部使用,但我不希望调用getFoos()
的客户端代码能够修改任何内容
从getFoos()
返回类型中的Foo
中删除const
限定符可以解决此问题。然而,我知道当std::vector
将其常量传播到元素时,boost::shared\u ptr
不会对它指向的对象做这样的事情(自然)。因此,在我看来,getFoos()
不再遵守它的const
限定符(即使编译器没有抱怨),因为客户端代码可以修改返回的共享指针指向的Foo
对象
我说得对吗?如果是这样的话,有没有办法编写
getFoos()
,这样它就可以返回一个const引用的const向量到const对象,而不进行复制呢?我可能错了,但我真的认为你无法做到这一点
shared_ptr
只能通过构造一个新实例到shared_ptr
对shared_ptr
的引用不能成为对shared_ptr
的引用,因为它们是两种不同的类型
在这里,您试图将对vector
的引用转换为const vector
的形式
第一个常量
非常好。因为可以使用常量限定符将引用分配给相同的引用类型
但是第二个
常量
不是,因为您实际上是在尝试将对类型a
的向量的引用转换为对类型B
的向量的引用,您可以返回一个常量共享的ptr*
指针而不是向量,并使用显式丑陋的C样式转换来转换foos.data()
插入您想要的任何内容
因为您对返回常量向量感兴趣,所以返回指针不会损失太多,当然,除了大小信息。您始终可以将新指针封装在一个类中,该类旨在提供此大小信息,如创建时提供的那样。与其返回一个
std::vector const&
,不如返回一个范围?范围是某种迭代器的对。在这种情况下,您的迭代器将被设置为std::shared\u ptr
。您可以通过编写一个快速迭代器适配器来实现这一点,该迭代器适配器在内部对const\u iterator
进行迭代,以std::shared\u ptr
的形式返回它们
你想在常量向量上执行的大多数操作都可以在随机访问常量迭代器的范围内执行。一旦Bar
的调用者获得了对向量的引用,它应该对其元素执行只读操作(或者更准确地说,在其元素指向的对象上)。