对于非指针类型,使用static_cast而不是C样式转换是否有任何优势?

时间:2014-12-17 12:23:47

标签: c++ casting compile-time

我很清楚使用static_cast而非C样式转换为指针类型的优势。

如果指针类型不兼容,则:

  • static_cast将在源代码
  • 中的特定行产生编译时错误
  • C风格的强制转换可能会导致"随机"指出程序的执行

但是我找不到任何类似非指针类型的例子。

换句话说,两种转换方法对非指针类型产生相同的结果。

这是正确的,还是我错过了什么?

如果是,static_cast仅用于非指针类型以保持编码一致性吗?

4 个答案:

答案 0 :(得分:33)

其他两个答案尚未提及的一个优点是static_cast更容易被发现。圆括号的含义在C ++中是众所周知的超载,并且很难发现邪恶(甚至是不正确的)强制转换。当我看到以_cast结尾的东西时,它就像一个心理速度颠簸:我放慢速度并仔细检查为什么类型系统被颠覆。

答案 1 :(得分:16)

我假设使用引用来避免指针的琐碎使用不会计算。

在这种情况下:C风格的演员阵容可以是:

  • a const_cast
  • a static_cast
  • a static_cast后跟const_cast
  • a reinterpret_cast
  • 一个reinterpret_cast后跟一个const_cast

除了static_cast对不可访问的基类的限制被解除外。

const_cast仅适用于指针和引用。

reinterpret_cast仅适用于指针和引用。它确实包括指针到整数的转换,反之亦然,但仍然涉及指针类型。

static_cast的特殊例外仅适用于指针和引用。

所以是的,通过排除指针和引用,你已经排除了C风格转换支持static_cast的所有内容。

  

如果是,static_cast仅用于非指针类型以保持编码一致性吗?

让我们进行类比:我不会用电锯打开一袋芯片。我可以,但链锯是危险的,所以通过使用一个,我会引入不必要的风险。使用电锯非常容易错误,如果我使用错了,就没有安全机制来防止事故发生。

答案 2 :(得分:15)

  

static_cast仅用于非指针类型以保持编码一致性吗?

不仅如此,还有助于保持正确性和未来的兼容性。

它有助于保持正确性,因为static_cast无法进行C风格演员可以进行的某些演员表。如果你对所涉及的某些类型犯了错误,或者在确信它是一个整数时处理一个指针(以及几层模板和typedef,这不是很难想象),这会有所帮助。因此,如果您想要static_cast,编写一个并获得编译时错误,您将立即被告知所涉及的类型不是您认为的类型。随着C风格演员的“随时随地”的态度,你不会及时发现错误。

它还有助于未来的兼容性。如果演员中涉及的类型在开发的后期发生变化,static_cast将报告一个错误,其中C风格的演员表会默默地改变其行为(对于非常可能不想要的东西)。

答案 3 :(得分:6)

  

static_cast是否仅用于非指针类型以保持编码一致性?

不(嗯 - 是的,但不仅仅是)。

也很容易找到/替换。这在重构,错误修复等情况下很重要。

这是对允许的强制转换类型的约束:考虑一个示例,其中您对变量进行C样式转换(可以正常工作),然后将转换变量的声明更改为呈现强制转换的内容(例如,您将int x;更改为void * const x;)。

C风格的演员突然使用相同的代码执行另一个功能(即const_cast<...>(reinterpret_cast<...>(...))。

如果用static_cast而不是C风格的强制转换编写初始代码,编译器会告诉你static_cast实际上没有执行静态强制转换。