static_cast抛出错误,但C风格的强制转换工作

Cin*_*out 2 c++ casting static-cast

我用的时候static_cast:

const C* cObj; // C is a user-defined class
void* obj = static_cast<void*>(cObj);
Run Code Online (Sandbox Code Playgroud)

我收到错误:

转换失去限定符

但是当我使用C风格的演员表时,它可以工作:

const C* cObj;
void* obj = (void*)cObj;
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

通过C++样式转换来实现它的正确方法是什么?

das*_*ght 5

为什么会这样?

C风格的演员阵容因为具有多个C++演员阵容的强大功能.例如,它可以抛弃常量并同时重新解释指针类型.此处描述了C++编译器用于决定如何解释特定C类型转换的过程.

一个C++转换常量指针的方法是将它转换为另一个常量指针,如下所示:

const void* obj = static_cast<const void*>(cObj);
Run Code Online (Sandbox Code Playgroud)

如果你还需要抛弃const-ness,你可以像这样链式转换:

void* obj = const_cast<void*>(static_cast<const void*>(cObj));
Run Code Online (Sandbox Code Playgroud)

const_cast像往常一样应用的常规注意事项:如果您正在转换的指针指向常量对象,则在转换后通过非const指针修改该对象会导致未定义的行为.