当我使用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 ++样式转换来实现它的正确方法是什么?
答案 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));