我们可以使用const_cast将const数据参数传递给参数为非const的函数。
int fun(int* ptr)
{
return (*ptr + 10);
}
int main(void)
{
int val = 10;
const int *ptr = &val;
int *ptr1 = const_cast <int *>(ptr);
cout << fun(ptr1);
return 0;
}
Output:
20
但是,我们也可以通过以下方式实现投射,
int fun(int* ptr)
{
return (*ptr + 10);
}
int main(void)
{
int val = 10;
const int *ptr = &val;
int *ptr1 = (int *)ptr;
cout << fun(ptr1);
return 0;
}
输出: 20
那么,在这个特定场景中使用const_cast的需求是什么? 仅在此特定场景中使用const_cast是否有任何优势?
答案 0 :(得分:3)
因为当你指定const_cast时,你明确地告诉你要删除constness,而旧式的转换允许你将任何内容转换为任何东西。见https://www.securecoding.cert.org/confluence/display/cplusplus/EXP05-CPP.+Do+not+use+C-style+casts
答案 1 :(得分:0)
邪恶的C风格演员阵容将完成任何远程转换。通过使用它,您放弃了类型系统在代码中捕获错误的任何希望。
C ++强制转换限制了可能的转换类型,减少了意外转换为错误的范围。
例如,如果您尝试使用指针,此演员表将编译,但会给出某种未定义的行为:
double * bad = (double*)ptr;
虽然此转换将无法编译,因为const_cast
无法进行类型转换:
double * less_bad = const_cast<double*>(ptr);
演员表工作(或多或少)如下:
static_cast
可让您撤消“安全”转化;例如,将指向基类的指针转换为指向派生类的指针,或将void*
转换为类型指针。它不允许在类型系统下无意义的转换。reinterpret_cast
允许更多的转换,例如将指针转换为整数或不相关的指针类型。如果您需要放弃类型系统来做一些时髦的事情,请小心使用它。const_cast
允许您删除const
和volatile
限定符,但不允许进行类型转换。dynamic_cast
允许在指针之间进行转换或对多态类型的引用,并通过运行时检查转换是否有效。这是唯一的“安全”演员,因为它不能给出错误输入的结果。static_cast
,reinterpret_cast
和const_cast
可以做的任何事情,以及更多。语法很难被发现或搜索,所以如果你想隐藏代码的真正恐怖并让维护程序员陷入疯狂,请使用它。