C++如何向由const shared_ptr组成的vector容器中插入元素?
你代码的问题出在两个地方:
const修饰的位置不符合你的实际需求,同时违反了std::vector对元素类型的要求std::vector没有append方法,插入元素应该用push_back或emplace_back
错误原因说明
std::vector 要求存储的元素类型必须是可赋值的,你写的std::vector<const std::shared_ptr<Example>>是把const修饰在shared_ptr本身,等于声明vector里存储的是不可修改的智能指针实例,vector做元素插入、内存重分配时需要对元素做拷贝/移动赋值,自然会编译失败。
而且你想要限制的是Example实例不被修改,不是智能指针本身不能改指向,const加的位置完全错了。
正确实现方案
你需要把const修饰在shared_ptr指向的Example类型上,写法如下:
// shared_ptr本身可正常拷贝赋值,指向的Example实例是const不可修改 std::vector<std::shared_ptr<const Example>> myVector;
插入元素的代码调整为:
const std::shared_ptr<Example> example = createMyObject(); myVector.push_back(example); // 可正常编译
这种写法下,从vector中取出的元素都是std::shared_ptr<const Example>类型,只能调用Example类的const成员函数,所有非const的setter方法都无法调用,完全满足你防止实例被修改的需求。
补充说明
如果你连vector里的智能指针指向都不允许修改(比如不允许把vector里的某个元素替换成另一个智能指针),可以对外只暴露该vector的const引用,接口返回类型为const std::vector<std::shared_ptr<const Example>>&即可。
内容的提问来源于stack exchange,提问作者malajedala
相关产品推荐
相关产品推荐

