static_cast 抛出错误,但 C 风格转换有效

static_cast throws error but C-style cast works

当我使用static_cast时:

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

我收到错误:

Conversion loses qualifiers

但是当我使用 C 风格的转换时,它起作用了:

const C* cObj;
void* obj = (void*)cObj;

为什么会这样?

通过 C++ 样式强制转换的正确方法是什么?

Why is it so?

C 风格的强制转换之所以有效,是因为它具有组合多个 C++ 强制转换的强大功能。例如,它可以抛弃 const-ness,同时重新解释指针类型。 here.

描述了 C++ 编译器用来决定如何解释特定 C 转换的过程

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

const void* obj = static_cast<const void*>(cObj);

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

void* obj = const_cast<void*>(static_cast<const void*>(cObj));

const_cast 的常规预防措施照常适用:如果您正在转换的指针指向常量对象,则在转换后通过非常量指针修改该对象会导致未定义的行为。

如果毁灭之路真的是你的意图...

struct C;

template<class T>
T* daringly_remove_const_and_damn_the_consequences(T const* p)
{
    return const_cast<T*>(p);
}

const C* cObj; // C is a user-defined class
void* obj = static_cast<void*>(daringly_remove_const_and_damn_the_consequences(cObj));