C++11中为何unsigned int与int可互存vector,嵌套vector却报错?
为什么vector能接受unsigned int元素,但vector<vector>不能接受vector?
能正常编译的代码示例
示例1:vector 存入 unsigned int
std::vector<int> vectest = {}; unsigned int a = 3; vectest.push_back(a);
示例2:vector 存入 int
std::vector<unsigned int> vectest = {}; int a = 3; vectest.push_back(a);
编译报错的代码示例
示例3:vector<vector> 存入 vector
std::vector<std::vector<int>> matrtest = {}; std::vector<unsigned int> vectest2 = {1}; matrtest.push_back(vectest2);
报错信息:
error: no matching function for call to 'std::vector<std::vector
>::push_back(std::vector &)'
示例4:vector<vector> 存入 vector
std::vector<std::vector<unsigned int>> matrtest = {}; std::vector<int> vectest2 = {1}; matrtest.push_back(vectest2);
报错信息:
error: no matching function for call to 'std::vector<std::vector
>::push_back(std::vector &)'
背后的逻辑
这两种情况的差异核心在于基本类型的隐式转换和容器类型的兼容性:
基本类型允许隐式转换:当你把
unsigned int存入vector<int>,或者把int存入vector<unsigned int>时,C++支持数值基本类型之间的隐式转换(只要数值在目标类型的合法范围内,比如示例里的3同时符合int和unsigned int的取值要求)。push_back接收的是对应元素类型的引用,编译器会自动完成数值类型的转换,因此代码能正常编译。容器类型不支持隐式转换:
vector<int>和vector<unsigned int>是完全独立的两种类型,哪怕它们的元素类型可以互相转换,容器本身并不具备隐式转换的能力。对于vector<vector<int>>来说,它的push_back只接受vector<int>(或其临时对象、右值引用),vector<unsigned int>无法被隐式转换成vector<int>,因此编译器会提示找不到匹配的函数。
内容的提问来源于stack exchange,提问作者Julien Larget-Piet
相关产品推荐
相关产品推荐

