static_cast <int>(foo)vs.(int)foo </int>

时间:2009-01-24 10:05:54

标签: c++ casting

有人可以详细说明这些差异吗?

3 个答案:

答案 0 :(得分:34)

区别在于(int)foo可能意味着六种不同的东西。 它可能是static_cast(在静态已知类型之间转换),它可能是const_cast(添加或删除const),或者它可能是reinterpret_cast(在指针类型之间转换)

编译器尝试每一个,直到找到一个有效的方法。这意味着它可能并不总是选择你期望的那个,所以它可能成为一个微妙的错误来源。

此外,static_cast更容易搜索或搜索/替换。

答案 1 :(得分:8)

查看Stroustrup has to say about that,包括以下内容:

  

因为C样式转换(T)可以用来表达许多逻辑上不同的操作,所以编译器只有最小的机会来捕获误用。 [...]

     

引入了“新式演员阵容”,让程序员有机会更清楚地表达他们的意图,并让编译器捕获更多错误。 [...]

特别是,C ++区分了static_castreinterpret_cast

  

这个想法是static_cast允许的转换比那些需要reinterpret_cast的转换更不可能导致错误。原则上,可以使用static_cast的结果而不将其强制转换回原始类型,而在使用它之前应始终将reinterpret_cast的结果转换回其原始类型以确保可移植性。

答案 2 :(得分:0)

(int)foo与c ++ reinterpret_cast<int>的比较最多,即没有检查演员表的有效性。