【问题标题】:using const_cast to pass const data argument to a function whose parameter is a non-const [duplicate]使用 const_cast 将 const 数据参数传递给参数为非 const 的函数 [重复]
【发布时间】:2014-01-30 11:23:09
【问题描述】:

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

【问题讨论】:

  • 除了代码清晰和安全之外,还有一个优势:它是 greppable。很难找到有人使用 C 风格强制转换抛弃 constness 的所有地方。
  • (int*) 在这种情况下与const_cast&lt;int*&gt; 相同。

标签: c++ const-cast


【解决方案1】:

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

【讨论】:

  • 无法访问上述链接
  • 嗯, - “相信我”, - 阿诺德施瓦辛格在“突击队”电影中的角色。实际上,C++ 风格的强制转换是作为旧的 C 风格强制转换的替代品而引入的。如上所述,它们更明确,它们很容易在整个代码中搜索,它们确实引起了审阅者的注意等。如果您没有明确的理由使用旧样式转换,最好避免使用它们,因为它们可以隐藏很多编程错误,并且可能危险的操作。
【解决方案2】:

邪恶的 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 可以做的任何事情,甚至更多。该语法很难发现或搜索,因此如果您想隐藏代码的真正恐怖之处并让维护程序员陷入疯狂,请使用此语法。

【讨论】:

    猜你喜欢
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    相关资源
    最近更新 更多