私有继承下Derived转Base的static_cast为何出现const转换错误?
关于私有继承下static_cast报错信息中const的疑问
代码示例
class Base { }; class Derived: private Base { }; int main() { Derived d; static_cast<Base>(d); }
问题说明
我明白由于私有继承,该转换会报错。但我感兴趣的是,为何错误信息是:
error: cannot cast 'const Derived' to its private base class 'const Base'
具体来说,为什么不是转换“Derived”到“Base”?错误信息中的const从何而来?
解答
这是因为static_cast<Base>(d)的本质是创建一个Base类型的临时对象,这个对象由d拷贝构造而来。在C++中,临时对象属于右值,编译器会自动将其视为const限定类型(隐式添加const修饰)。
编译器在检查转换权限时,实际处理的是“将const Derived类型的右值转换为const Base”——由于临时对象的const属性,错误信息里就带上了const修饰符。
总结两点:
- 代码里的
d本身是非const的,但转换过程中生成的临时拷贝会被标记为const - 私有继承限制了Derived到Base的所有转换权限,不管是const还是non-const版本都会报错,只是编译器用临时对象的const类型来描述这个错误场景。
内容的提问来源于stack exchange,提问作者Y.T.
相关产品推荐
相关产品推荐

