为何无法将std::vector<std::shared_ptr<T>>隐式转换为std::vector<std::shared_ptr<const T>>
- C++中,
std::vector<A>和std::vector<B>是完全独立的模板实例化类型,哪怕A可以隐式转换为B,容器类型本身也不支持隐式转换。这是模板类型系统的基本规则——不同的模板参数会生成完全不同的类型,编译器不会为它们自动建立转换关系。 - 虽然
std::shared_ptr<T>可以隐式转换为std::shared_ptr<const T>,但这种转换只作用于单个智能指针对象。容器层面不会自动遍历所有元素完成转换,再生成一个兼容的容器临时对象来匹配函数参数。 - 函数参数中的
const仅修饰容器本身(保证不会修改容器的结构,比如添加、删除元素),但容器的元素类型仍然是std::shared_ptr<const T>,和传入的std::vector<std::shared_ptr<T>>的元素类型不匹配,因此编译器拒绝这种隐式转换。
如果需要传递这类对象,你可以显式构造一个目标类型的容器:
std::vector<std::shared_ptr<T>> input = ...; func(std::vector<std::shared_ptr<const T>>(input.begin(), input.end()));
利用单个shared_ptr的隐式转换,范围构造可以快速生成符合要求的容器。
内容的提问来源于stack exchange,提问作者Wayne Huo
相关产品推荐
相关产品推荐

