C++中const char[n]无法转换为MyString的原因解析
问题原因分析
核心问题:explicit构造函数禁止隐式转换
你给const char*参数的构造函数加了explicit修饰,这个关键字的作用就是禁止该构造函数被用于隐式类型转换。
两种初始化方式的本质区别
你能正常初始化的
str1和str2应该是直接初始化,比如:MyString str1("abcde"); // 直接调用构造函数创建对象,不受explicit限制 MyString str2{"abcde"}; // 列表初始化,同样允许调用explicit构造函数这种方式是直接触发构造逻辑,语法上不要求隐式转换,所以能正常编译。
而
MyString str3 = "abcde"属于拷贝初始化,它的语法逻辑是:先把"abcde"隐式转换成临时MyString对象,再用这个临时对象拷贝构造str3(哪怕编译器用RVO优化掉拷贝步骤,语法层面依然要求隐式转换合法)。但explicit构造函数会直接阻止这个隐式转换流程,所以编译报错。
为什么加operator=没用?
你可能混淆了初始化和赋值的场景:MyString str3 = "abcde"是对象初始化,不是赋值操作。赋值是针对已经存在的对象,比如:
MyString str3; str3 = "abcde"; // 这时候才会调用你写的operator=
但初始化阶段根本不会走到赋值运算符的逻辑,所以加operator=解决不了问题。
可选解决办法
- 若想保留
explicit(推荐,能避免意外的隐式转换bug),就改用直接初始化/列表初始化的方式创建str3; - 若一定要用
=的初始化语法,去掉构造函数的explicit修饰即可。
内容的提问来源于stack exchange,提问作者Average_C_Enjoyer
相关产品推荐
相关产品推荐

