Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回指向常量对象的常量共享指针的常量向量_C++_Stl_Constants_Shared Ptr - Fatal编程技术网

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
的调用者获得了对
向量的引用,它应该对其元素执行只读操作(或者更准确地说,在其元素指向的对象上)。