使用const_cast将const数据参数传递给参数为非const的函数

时间:2014-01-30 11:23:09

标签: c++ const-cast

我们可以使用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是否有任何优势?

2 个答案:

答案 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允许您删除constvolatile限定符,但不允许进行类型转换。
  • dynamic_cast允许在指针之间进行转换或对多态类型的引用,并通过运行时检查转换是否有效。这是唯一的“安全”演员,因为它不能给出错误输入的结果。
  • 邪恶的C演员允许static_castreinterpret_castconst_cast可以做的任何事情,以及更多。语法很难被发现或搜索,所以如果你想隐藏代码的真正恐怖并让维护程序员陷入疯狂,请使用它。