const const的做法有何不同?

时间:2012-06-19 16:30:30

标签: c++

const_cast和c样式转换(ObjectType)之间是否存在实际差异?

6 个答案:

答案 0 :(得分:11)

A const_cast传达有关C演员不能投射的意图的具体信息。

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

此外,{C}风格演员不同,const_cast是可搜索的。

答案 1 :(得分:4)

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

C风格的演员阵容可以和任何“新”演员阵容一样,除了dynamic_cast之外(它可以做一些他们都无法做到的事情,虽然它在这里并不真实相关)

答案 2 :(得分:2)

C ++中的C风格强制转换尝试静态强制转换,重新解释强制转换,常量强制转换或其组合。

建议避免C演员表主要是因为......

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

答案 3 :(得分:1)

同样的行动。 C风格的强制转换可以抛弃const。

const_cast的原因在于它可以作为一个可搜索的红旗,可以搜索并仔细审查/惩罚有罪者。这个想法是C ++比C更紧密。因此,如果不是不可能的话,故意违反类型系统(例如违反const正确性)很容易被发现。

完全不可能违反类型安全性会破坏过多的向后兼容性。

答案 4 :(得分:1)

const_cast只能修改参数的 const-ness (或 volatile-ness ),而不是 basic 类型。所以

 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-style强制转换将符合条件的T*修改为U*而没有任何问题。

答案 5 :(得分:0)

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

此外,搜索更容易。