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

时间:2017-09-15 10:41:28

标签: c++ casting static-cast

当我使用CATALINA_HOME=e:\Java\apache-tomcat-9.0.0.M26 JAVA_HOME= C:\Program Files\Java\jdk1.8.0_111 JRE_HOME= C:\Program Files\Java\jre1.8.0_144 ClassPath=%JAVA_HOME%\bin;%JRE_HOME%\bin;%CATALINA_HOME%\lib 时:

static_cast

我收到错误:

  

转换失去限定符

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

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

为什么会这样?

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

2 个答案:

答案 0 :(得分:5)

  

为什么会这样?

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

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

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

如果你还需要抛弃常量,你可以像这样链式转换:

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

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

答案 1 :(得分:0)

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

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));