有人可以详细说明这些差异吗?
答案 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_cast
和reinterpret_cast
:
这个想法是static_cast允许的转换比那些需要reinterpret_cast的转换更不可能导致错误。原则上,可以使用static_cast的结果而不将其强制转换回原始类型,而在使用它之前应始终将reinterpret_cast的结果转换回其原始类型以确保可移植性。
答案 2 :(得分:0)
(int)foo与c ++ reinterpret_cast<int>
的比较最多,即没有检查演员表的有效性。