有人可以详细说明这些差异吗?
不同之处在于(int)foo可能意味着六种不同的东西.它可能是static_cast(在静态已知类型之间转换),它可能是const_cast(添加或删除const),或者它可能是reinterpret_cast(在指针类型之间转换)
编译器会尝试每一个,直到找到一个有效的方法.这意味着它可能并不总是选择您期望的那个,因此它可能成为错误的微妙来源.
此外,static_cast更容易搜索或搜索/替换.
看看Stroustrup对此有何看法,包括以下内容:
因为C样式转换(T)可以用来表达许多逻辑上不同的操作,所以编译器只有最小的机会来捕获误用.[...]
引入了"新式演员阵容",使程序员有机会更清楚地表达他们的意图,并让编译器捕获更多错误.[...]
特别是,C++区分static_cast
和reinterpret_cast
:
我们的想法是,static_cast允许的转换比那些需要reinterpret_cast的转换更不可能导致错误.原则上,可以使用static_cast的结果而不将其强制转换回原始类型,而在使用它之前应始终将reinterpret_cast的结果转换回其原始类型以确保可移植性.