C++基类拷贝构造函数处理派生类三元表达式报错问题咨询
问题原因
三元运算符?:有个硬性规则:它的两个结果分支必须能被编译器推导为同一个共同类型。虽然derived_a和derived_b都是base的子类,但它们本身是完全独立的类型,互相之间没有继承关系,编译器没法自动把这两个不同的子类类型统一成一个合法的共同类型。
而单独用derived_a()或derived_b()初始化base对象时,是触发了子类到基类的隐式向上转型,这个转换是C++允许的,所以单独初始化没问题,但三元表达式不允许这种“两个分支类型不统一”的情况。
解决方法
有几种简单的方式可以修复这个问题:
显式转换为基类类型:把两个分支的临时对象都转成
base类型,让三元表达式的两个分支类型一致:base C( true ? static_cast<base>(derived_a()) : static_cast<base>(derived_b()) );其实只转换其中一个分支也可以,编译器会自动把另一个分支也隐式转成
base类型,但显式转换更清晰。直接构造基类对象:在每个分支里直接创建
base对象,这样两个分支的类型都是base:base C( true ? base(derived_a()) : base(derived_b()) );
内容的提问来源于stack exchange,提问作者user3600124
相关产品推荐
相关产品推荐

