为何int无法隐式转换为vector<double>?相关技术疑问
关于
vector<double> v2 = 9;编译错误的解答 1. 复制初始化失败的核心原因
没错,问题就出在std::vector<double>的单参数构造函数(vector(size_type n))被声明为explicit。
C++的复制初始化语法(即=赋值式初始化)有个关键限制:不能调用标记为explicit的构造函数来完成隐式类型转换。这里的9是int类型,要转成vector<double>必须通过那个explicit构造函数,但复制初始化不允许这种隐式调用,所以编译器直接抛出“无法从int转换到vector”的错误。
2. 构造函数非explicit时的类型转换情况
如果这个构造函数没有explicit修饰,vector<double> v2 = 9;是可以正常编译的,但这里的转换逻辑要理清:
- 首先,int类型的
9会隐式转换为vector构造函数的参数类型size_type(这是一个无符号整数类型,int到它的隐式转换是C++允许的); - 接着调用构造函数,生成一个包含9个默认初始化
double元素的vector<double>临时对象; - 最后这个临时对象会被移动(或经编译器优化后直接在
v2的内存空间构造)。
注意:这不是“浮点-整数类型转换”,而是用整数转成的容器大小参数来构造vector。如果想把9作为单个double元素初始化vector,应该写vector<double> v2 = {9.0};或者vector<double> v2(1, 9.0);,这和vector构造函数的参数语义有关。
内容的提问来源于stack exchange,提问作者CosmicHusky
相关产品推荐
相关产品推荐

