const cast有什么不同之处? < P> >在StaskSCAST与C风格的CAST(ObjectType)之间存在实际差异吗? < P> C风格的C++中的Casic尝试静态映射、重新解释、强制转换或组合。

const cast有什么不同之处? < P> >在StaskSCAST与C风格的CAST(ObjectType)之间存在实际差异吗? < P> C风格的C++中的Casic尝试静态映射、重新解释、强制转换或组合。,c++,C++,建议避免C类型转换,主要是因为 reinterpret cast和const cast的使用非常少,因此可以强调您正在做的事情 在其他情况下,当您需要静态强制转换时,显式地编写它会比C强制转换提供额外的编译时检查 Aconst\u cast传达了有关C cast无法传达的cast背后意图的特定信息 如果您不小心试图将常量转换用于添加或删除常量或易失性以外的目的,编译器将帮助您显示错误消息 另外,const\u cast是可搜索的,与C风格的cast不同。aconst\u cast只能添加或删除

建议避免C类型转换,主要是因为

  • reinterpret cast和const cast的使用非常少,因此可以强调您正在做的事情
  • 在其他情况下,当您需要静态强制转换时,显式地编写它会比C强制转换提供额外的编译时检查

A
const\u cast
传达了有关C cast无法传达的cast背后意图的特定信息

如果您不小心试图将
常量转换
用于添加或删除
常量
易失性
以外的目的,编译器将帮助您显示错误消息


另外,
const\u cast
是可搜索的,与C风格的cast不同。

a
const\u cast
只能添加或删除
const
-ness(或
volatile
-ness,尽管这不太常见)


C风格的强制转换可以做与任何“新”强制转换相同的事情,除了
动态\u强制转换
(它可以做一些他们都做不到的事情,尽管在这里它不是真正相关的)。

强制转换更受限制,除了更改常量之外,不允许您做任何事情。这使其更安全,即更少发生事故


此外,搜索更容易。

同样的操作。一个C型的演员同样可以抛弃常数

const_cast的原因是它可以作为一个可搜索的红旗,可以搜索并仔细审查/惩罚罪犯。C是C++的一种更为紧凑的类型,因此对类型系统的有意违反(如违反const正确性),如果不是不可能的话,很容易被发现。
使此类违反类型安全的行为完全不可能会破坏太多向后兼容性。

const_cast
只能修改参数的常量(或volatile ness),而不能修改其基本类型。所以

 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
const T*tc=f();
挥发性T*tv=g();
U*ua=常数(tc)//错误
U*ub=常数(电视)//错误
U*ub=(U*)(tc)//可以
U*ub=(U*)(电视)//可以

因此,c-style cast可以毫无问题地将cv-qualified
T*
修改为
U*

c
cast比其他类型的组合更强大。在某些情况下,唯一的选择是C风格的强制转换(例如,向上转换到一个私有基),尽管可以说你无论如何都不应该写那个代码…@DavidRodríguez dribeas,这很有趣,但我不能复制它@Kos:虽然不能保证,
reinterpret\u cast
通常可以使用单一继承。对于多重继承,它通常对一个基类有效,但对所有其他基类无效(只有一个基类可以位于派生对象的开头)。@Kos:不同之处在于,在这种情况下,C样式转换相当于忽略访问说明符的
静态\u转换。考虑<代码>结构d:a,b,私有c{}d;<代码>对
(void*)(C*)和d
(void*)的重新解释(&d)
的输出将不同。在C类型转换的情况下,指针将指向实际的
C
子对象,而在
reinterpret\u cast
的情况下,指针将指向
D
对象的位置(或第一个基)@DavidRodríguez dribeas:过度迂腐几乎总是有利于一两张赞成票(尽管有时只适用于其他同样迂腐的人…:-)