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

bar*_*nos 33 c++ casting compile-time

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

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

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

但我无法找到非指针类型的任何类似示例.

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

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

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

Fre*_*abe 33

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

  • 可读性......有时远比技术原因重要. (11认同)
  • 可读性和简单的视觉识别都很不错,但是使用CTRL + F,静态广播比c风格演员显示的真正的巨大优势.您是否曾尝试在代码库的主要部分中找到所有现有的c样式转换? (4认同)

小智 16

我假设使用引用来避免指针的琐碎使用将不计算在内.

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

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

除了static_cast对不可访问的基类的限制被取消之外.

const_cast 仅适用于指针和引用.

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

该特殊异常static_cast仅适用于指针和引用.

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

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

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

  • 适当的比喻是,你应该确定它是一袋用你的火焰喷射器而不是一把刀打开的筹码,而不是一袋爆米花或炸药会在不同程度上炸掉你的脸. (3认同)
  • 比喻的更生动的版本:你当然可以用电锯切割你的脚趾甲,但你最好知道你在做什么. (2认同)

Rei*_*ica 15

难道static_cast仅仅是为了保持一致性编码用于非指针类型?

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

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

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


utn*_*tim 6

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

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

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

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

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

如果使用static_cast而不是C样式转换编写初始代码,编译器会告诉您static_cast实际上没有执行静态转换.