为什么要在C ++中对数字强制转换使用“ static_cast”?

时间:2018-11-15 10:32:08

标签: c++ casting

有时,我们需要将一种数字类型显式转换为另一种数字类型(例如,避免在丢失精度或范围时发出警告)。对于某些人:

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是什么。

对于数字类型,使用新的更好的转换是否有重要的原因?

2 个答案:

答案 0 :(得分:1)

在一般情况下(您已经提到),您希望使用显式C ++强制转换以避免When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?中提到的可能的问题(移入reinterpret_cast的能力)。

在数字情况下,您至少会获得两个好处:

  • 您无需记住,数字的C样式强制转换为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
  •   
     

可以使用显式类型转换的强制转换符号执行。

[expr.cast/4]

如果您认为是安全的 表达式,则指定static_cast会向您发出编译时错误警报,而不是默默地具有未定义的行为。 / p>