reinterpret_cast 可以用来将指针强制转换为未实现的类指针吗?

问题描述 投票:0回答:1

我有两个类,一个有实现,另一个没有。然后在

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”,那么它将显示预期的错误。

c++ reinterpret-cast static-cast
1个回答
0
投票
对象指针上的

reinterpret_cast
仅受到限制,因为它不能摆脱常量性。对对象类型没有限制,所以你这里的例子确实是合法的。编译器必须编译这个。

static_cast
有一整套额外的要求,这就是为什么它在这里不起作用。但
reinterpret_cast
很大程度上是一个“我知道我在做什么,现在闭嘴”的演员。

© www.soinside.com 2019 - 2024. All rights reserved.