在C++中将指向对象的指针转换为void*

jco*_*der 13 c++ pointers casting

我一直在阅读StackOverflow,并开始怀疑我写过的所有代码,我一直在想"这是不确定的行为?" 甚至在已经工作了很长时间的代码中.

所以我的问题 - 将一个对象(在本例中为抽象接口类)的指针强制转换为void*然后将它们转换回原始类并使用它们调用方法是否安全且定义良好的行为?

我完全清楚这样做的代码可能很糟糕.我现在甚至不考虑这样写它(这是我不想改变的旧代码),所以我不是在寻找更好的方法来讨论它.如果我再次这样做,我已经知道如何更好地写它.但是,如果在C++中实际上已经破坏依赖于此,那么我将不得不考虑更改代码,如果它只是糟糕的代码,那么改变它将不是优先考虑的事情.

我对一年或两年前这么简单的事情毫不怀疑,但随着我对C++的理解增加,我发现我越来越担心代码在标准下是安全的,即使它运行得非常好.也许阅读过多的堆栈溢出有时对生产力是一件坏事:P

ken*_*ytm 16

你很安全.

从C++(0x)草案,

§5.2.9/ 13(for static_cast):

指向对象的类型指针的值转换为"指向cv的 指针void"并返回,可能具有不同的cv-qualification,应具有其原始值.

§5.2.10/ 7(for reinterpret_cast):

将"指向T1"的类型的rvalue转换为"指向"的类型T2(其中T1T2是对象类型,并且对齐要求T2不比那些更严格T1)并返回其原始类型,从而生成原始指针值.

(当然,转换为不相关的类是未定义的行为.)


Kon*_*lph 8

所以我的问题 - 将一个对象(在本例中为抽象接口类)的指针强制转换为void*然后将它们转换回原始类并使用它们调用方法是否安全且定义良好的行为?

是的 - 只要你回到完全相同的类型.否则,基类指针调整可能会破坏指针的值.

在实践中,这可能(仅可能)在使用多重继承时是相关的:指向派生类的指针的物理地址可能与指向其基类的指针不同.