gpt4 book ai didi

c++ - 返回指向 const 对象的 const 共享指针的 const vector

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:47:04 28 4
gpt4 key购买 nike

给定以下基于共享指针容器的类,

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 vector ?

最佳答案

我可能是错的,但我真的不认为你能做到这一点。

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 的 vector 对 Type B vector 的引用.

关于c++ - 返回指向 const 对象的 const 共享指针的 const vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13464199/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com