C++单参数string构造函数隐式转换const char数组失败原因求解
报错触发原因
核心是C++ 拷贝初始化(即类名 对象 = 右值的写法) 对隐式转换的次数限制:该写法仅允许最多1次用户定义的隐式转换,你的第二段代码需要两次隐式转换,不符合规则,因此报错。
具体拆解:
- 第一段代码中,右值
132本身就是int类型,和A类的单参数构造函数A(int)参数完全匹配,只需要调用1次构造函数完成转换,符合规则,因此运行正常。 - 第二段代码中,
"RANDOMSTRING"是const char[13]类型(即C风格字符串),而A类的构造函数接收的是std::string类型,要完成初始化需要两步用户定义的隐式转换:- 第一步:将
const char[13]隐式转换为std::string类型的临时对象 - 第二步:将生成的
std::string临时对象隐式转换为A类对象
两次隐式转换超出了拷贝初始化的规则限制,因此编译器抛出转换失败的错误。
- 第一步:将
常见修复方案
- 方案1:改用直接初始化写法,不受单次隐式转换限制:
A x("RANDOMSTRING"); - 方案2:手动完成第一步转换,保证仅需一次用户定义的隐式转换:
A x = std::string("RANDOMSTRING"); - 方案3:给A类新增接收
const char*类型的单参数构造函数,省去第一步转换:A(const char* M):m(M){}
内容的提问来源于stack exchange,提问作者Johnny
相关产品推荐
相关产品推荐

