常量强制转换有什么不同

What does a const cast do differently?

本文关键字:什么 转换 常量      更新时间:2023-10-16

const_cast 样式转换(ObjectType)之间有实际区别吗?

const_cast传达

有关强制转换背后的意图的特定信息,而 C 强制转换无法传达。

如果您不小心尝试将const_cast用于添加或删除constvolatile以外的目的,编译器将帮助您处理错误消息。

此外,const_cast是可搜索的,不像 C 样式的演员表。

const_cast只能添加或删除const -ness(或volatile -ness,尽管这种情况不太常见)。

C 风格的演员可以做与任何"新"演员相同的工作,除了dynamic_cast(它可以做一些他们都做不到的事情,尽管它在这里并不真正相关)。

C++中的 C 样式强制转换尝试静态强制转换、重新解释转换、const 强制转换或这些转换的组合。

建议避免C型,主要是因为...

  • 重新解释 Casts 和 const Cast 很少使用,以至于强调你正在做的事情是件好事,
  • 在其他情况下,当您需要静态强制转换时,与 C 强制转换相比,显式编写它可为您提供额外的编译时检查。

相同的操作。C 型铸型可以同样抛弃常量。

const_cast的原因是它可以作为一个可搜索的危险信号,搜索和仔细审查/惩罚有罪的人。这个想法是C++比 C 更严格。因此,故意违反类型系统(例如违反const正确性),如果不是不可能的话,也很容易被发现。

使这种完全不可能违反类型安全的行为会破坏太多的向后兼容性。

const_cast只能修改参数的常量(或易失性),而不是它的基本类型。所以

 const T *tc = f();
 volatile T *tv = g();
 U *ua = const_cast<U*>(tc); //error
 U *ub = const_cast<U*>(tv); //error
 U *ub = (U*)(tc); //okay
 U *ub = (U*)(tv); //okay

因此,c型铸造将符合cv标准的T*修改为U*没有任何问题。

const_cast受到更多限制,除了改变常量之外,不会让你做任何事情。这使得它更安全,即不易发生事故。

此外,它更容易搜索。