C++构造函数隐式转换规则:char转int可生效原理疑问
C++ 隐式转换规则差异原因解答
核心规则
C++ 对隐式转换序列的限制为:整个转换过程中最多允许1次用户自定义转换,内置标准类型转换的次数不受限制。
两者的定义区分:
- 标准转换:C++语言内置定义的类型转换,比如算术类型之间的转换(char转int、int转float等)、数组转指针、指针转
void*等,不需要用户自定义类的构造函数或转换函数参与。 - 用户自定义转换:通过类的非
explicit单参数构造函数、或者类的转换运算符实现的转换,比如std::string的std::string(const char*)构造函数,你定义的A::A(int)、A::A(std::string)构造函数都属于这一类。
各场景逐一解释
1. A obj_5 = ch; 编译成功的原因
这里的转换序列是:char(内置类型) -> int(标准算术转换,不属于用户自定义转换) -> A(调用A::A(int),1次用户自定义转换)
整个序列只有1次用户自定义转换,符合规则,因此编译通过,运行时会调用A(int)构造函数输出对应日志。
2. A obj_6 = "Hello"; 和 A obj_7 = ptr; 编译失败的原因
字符串字面量的类型是const char[N],隐式转换后会变成const char*,ptr本身就是const char*类型,这里的转换序列是:const char* -> std::string(调用std::string的const char*构造函数,第1次用户自定义转换) -> A(调用A::A(std::string),第2次用户自定义转换)
整个序列出现了2次用户自定义转换,违反了C++的隐式转换规则,因此编译报错。
3. 原有认知验证
你提到的obj_2 = str和obj_4 = 10的逻辑是完全正确的:
std::string转A只有1次用户自定义转换int转A只有1次用户自定义转换
都符合规则,因此可以正常编译运行。
如果想要让obj_6、obj_7可以正常编译,手动加一层显式转换即可:
A obj_6 = std::string("Hello"); // 显式完成const char*到std::string的转换,隐式转换只剩std::string转A的1次 A obj_7 = std::string(ptr);
内容的提问来源于stack exchange,提问作者Sarang Chaudhari
相关产品推荐
相关产品推荐

