我有两个类,一个有实现,另一个没有。然后在
main()
函数中,我定义了一个带有实现的类的实例,然后 reinterpret_cast
将该实例的地址传递给另一个没有实现的类。没有任何错误:
struct StructNoImplementaion;
struct StructWithImplementation {
StructWithImplementation(int m) : member1(m) {}
int member1;
};
int main()
{
StructWithImplementation s73(3);
// no error
StructNoImplementaion* p73 = reinterpret_cast<StructNoImplementaion*>(&s73);
// error: cannot convert from 'StructWithImplemetation' to 'StructNoImplementation'
//StructNoImplementaion* p73 = static_cast<StructNoImplementaion*>(&s73);
}
有人可以帮我理解为什么吗?
reinterpret_cast
不需要知道目标类的内存布局?如果我用“static_cast”替换“reinterpret_cast”,那么它将显示预期的错误。
reinterpret_cast
仅受到限制,因为它不能摆脱常量性。对对象类型没有限制,所以你这里的例子确实是合法的。编译器必须编译这个。
static_cast
有一整套额外的要求,这就是为什么它在这里不起作用。但 reinterpret_cast
很大程度上是一个“我知道我在做什么,现在闭嘴”的演员。