我有一个:
std::vector<std::shared_ptr<T>>
我想复制到哪一个
std::vector<std::shared_ptr<const T>>
现在我注意到如果我这样做:
class A { public: A(const std::vector<std::shared_ptr<int>>& list) : internalList(list.begin(),list.end()) {} std::vector<std::shared_ptr<const int>> internalList; };
它编译得很好(clang std == c 14)但如果我这样做:
class A { public: A(const std::vector<std::shared_ptr<int>>& list) : internalList(list) {} std::vector<std::shared_ptr<const int>> internalList; };
我觉得很奇怪,当我使用复制构造函数时,它不起作用,因为它无法弄清楚从非const到const的转换?
xxxx.cpp:672:56: error: no matching constructor for initialization of 'std::vector<std::shared_ptr<const int> >'
解决方法
首先,用不同类型实例化的类模板完全是不同类型的.然后std :: shared_ptr< int>和std :: shared_ptr< const int>是完全不同的类型,std :: vector< std :: shared_ptr< int>>和std :: vector< std :: shared_ptr< const int>>也是不同的类型,不能互相转换.
根据std :: vector的constructors,复制构造函数(第5个)采用与其参数类型相同的std :: vector.它意味着对于std :: vector< std :: shared_ptr< const int>>,它不能采用std :: vector< std :: shared_ptr< int>>,它们无法转换为std :: vector< ; std :: shared_ptr< const int>>含蓄.
另一方面,构造函数采用迭代器范围(第4个)是函数模板,迭代器的类型是模板参数,它不必是指向相同类型的迭代器.如果此类型可用于构造向量,则允许它是指向其他类型的迭代器.的std :: shared_ptr的< INT>可以用来构造std :: shared_ptr< const int>,然后就可以了.
请注意,std::shared_ptr具有复制/移动构造函数模板,这些模板可以将std :: shared_ptr作为其参数使用不同的元素类型. (虽然std :: vector没有.)