-1

我们可以使用 const_cast 将 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 有什么好处吗?

4

2 回答 2

3

因为当您指定 const_cast 时,您明确告诉您希望删除 constness,而旧式强制转换允许您将任何内容强制转换为任何内容。见https://www.securecoding.cert.org/confluence/display/cplusplus/EXP05-CPP.+Do+not+use+C-style+casts

于 2014-01-30T11:25:59.433 回答
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_cast并且const_cast可以做,以及更多。语法很难发现或搜索,所以如果你想隐藏代码的真正可怕之处并让维护程序员陷入疯狂,请使用它。
于 2014-01-30T13:15:15.307 回答