有时,我们需要将一种数字类型显式转换为另一种数字类型(例如,避免在丢失精度或范围时发出警告)。对于某些人:
double foo;
我们可以这样写:
(float)foo
但是大多数C ++程序员都说这是邪恶的“旧样式转换”,您应该使用“新样式转换”:
static_cast<float>(foo)
还有boost::numeric_cast
的一个替代方案,它很有趣(至少在对性能要求不严格的代码中),但是这个问题与static_cast
有关。
已经问过一个similar question,但是那里使用的最重要的参数对数字转换无效(我认为我错了吗?)。有它们:
您必须明确告诉编译器您想做什么。是上流还是下流?也许重新解释演员表?
不。这是简单的数字转换。没有歧义。如果我知道static_cast<float>
的工作原理,那么我知道它对“旧式”演员表的工作原理。
当您写(T)foo
时,您不知道T
是什么!
我不是在写(T)foo
,而是在写(float)foo
。我知道float
是什么。
对于数字类型,使用新的更好的转换是否有重要的原因?
答案 0 :(得分:1)
在一般情况下(您已经提到),您希望使用显式C ++强制转换以避免When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?中提到的可能的问题(移入reinterpret_cast
的能力)。
在数字情况下,您至少会获得两个好处:
static_cast
并且永远不会达到reinterpret_cast
-我将其称为“易用性”和“无意外”部分grep 'static_cast<double>'
与grep '(double)'
,它们可以是函数签名的一部分)答案 1 :(得分:1)
就像许多从C继承下来的东西一样,更具体的C ++变体可以将阅读器的代码通知给不是编译器。
您使用static_cast<double>
是因为它不会执行(double)
可以做的所有事情。
由
执行的转换
- 一个
const_cast
,- 一个
static_cast
,- 一个
static_cast
后跟一个const_cast
,- 一个
reinterpret_cast
或- 一个
reinterpret_cast
后跟一个const_cast
,可以使用显式类型转换的强制转换符号执行。
如果您认为是安全的 表达式,则指定static_cast
会向您发出编译时错误警报,而不是默默地具有未定义的行为。 / p>