C++ 对于非指针类型,使用静态类型转换而不是C样式转换有什么优势吗?

C++ 对于非指针类型,使用静态类型转换而不是C样式转换有什么优势吗?,c++,casting,compile-time,C++,Casting,Compile Time,我很清楚使用static\u cast而不是C风格的指针类型转换的优势 如果指针类型不兼容,则: static\u cast将在源代码中的特定行产生编译时错误 C样式转换可能会在程序执行过程中的“随机”点导致运行时错误 但对于非指针类型,我找不到任何类似的例子 换句话说,对于非指针类型,两种强制转换方法产生相同的结果 是这样,还是我遗漏了什么 如果是的话,static\u cast是否仅用于非指针类型以保持编码一致性?我假设避免指针的引用的琐碎使用将不起作用 在这种情况下:C样式转换可以是:

我很清楚使用
static\u cast
而不是C风格的指针类型转换的优势

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

  • static\u cast
    将在源代码中的特定行产生编译时错误
  • C样式转换可能会在程序执行过程中的“随机”点导致运行时错误
但对于非指针类型,我找不到任何类似的例子

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

是这样,还是我遗漏了什么


如果是的话,
static\u cast
是否仅用于非指针类型以保持编码一致性?

我假设避免指针的引用的琐碎使用将不起作用

在这种情况下:C样式转换可以是:

  • a
    const\u cast
  • a
    static\u cast
  • 一个
    static\u cast
    后接一个
    const\u cast
  • a
    重新解释演员阵容
  • 一个
    重新解释cast
    后接一个
    常量cast
除了
static\u cast
对不可访问基类的限制被取消之外

const_cast
仅适用于指针和引用

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

static\u cast
的特殊例外仅适用于指针和引用

是的,通过排除指针和引用,您已经排除了C风格强制转换对
静态\u强制转换所支持的所有内容

如果是,
static\u cast
是否仅用于非指针类型以保持编码一致性

让我们打个比方:我不会用电锯打开一袋薯片。我可以,但电锯是危险的,所以使用电锯会带来不必要的风险。电锯很容易用错,如果我用错了,就没有安全机制来防止事故

static\u cast
是否仅用于非指针类型以保持编码一致性

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

它有助于保持正确性,因为
static_cast
无法执行C风格cast可以执行的某些转换。如果您在涉及的某些类型上犯了错误,这会有所帮助,可能是在确信指针是整数的情况下处理指针(在模板和typedef的几层中,这并不难想象)。因此,如果您打算执行一个
静态\u cast
,编写一个并得到一个编译时错误,您将立即被告知所涉及的类型与您想象的不同。凭借C-style演员的“随机应变”态度,你不会及时发现错误


它也有助于未来的兼容性。如果cast中涉及的类型在开发后期发生更改,则
静态\u cast将报告一个错误,其中C风格的cast会默默地更改其行为(很可能是无意的)。

其他两个答案尚未提及的一个优点是
静态\u cast
更容易发现。在C++中括号的含义是众所周知的重载,很难找出错误的(甚至错误的)转换。但是,当我看到某个东西以
\u cast
结尾时,它就像一个心理减速器:我减速并仔细检查类型系统被破坏的原因

静态_cast是否仅用于非指针类型以保持编码一致性

不(嗯,是的,但不仅如此)

也很容易找到/更换。这在重构、bug修复等情况下非常重要

这是一个对允许的强制类型的约束:考虑一个例子,在一个变量上有一个C风格的强制转换(它很好),然后将被铸造变量的声明更改为使铸件无效的东西(例如,你改变<代码> int x;< /COD> > <代码>空白> const x;< /p>)。 C样式转换突然使用相同的代码执行另一个功能(即

常量转换(重新解释常量(…)


如果您使用静态类型转换而不是C样式转换来编写初始代码,编译器会让您知道其中的静态类型转换实际上并没有执行静态类型转换。

C样式转换不关心输入或输出是否是指针。它很乐意在指针和非指针之间转换。@Dinal24:它不涉及我的特定q关于非指针类型的
static_cast
优于常规cast的优点的讨论。Scott Meyers最优秀的
有效的C++
书中的第2项有一个专门的部分,标记为“更喜欢C++风格的cast”关于这个确切的主题。我不认为这是一个重复的。这个问题的答案可以从一个推到一般的一个,但没有明确说明。好吧,这里给出的答案与其他两个重复的答案完全相同。除了一个明确的“是”虽然你明确地解释了为什么你更喜欢C++的样式转换……你的比喻更生动的版本:你当然可以用链锯切割你的脚趾甲,但是你最好知道你在做什么。“FrriChrabe,另一方面,如果你知道你在做什么,你就不会用链锯切割你的脚趾甲。”恰当的比喻是,你应该他妈的确定这是一袋薯片,你用火焰喷射器而不是刀子打开,而不是一袋爆米花或炸药,它们会在不同程度上炸到你的脸上。@PeterSchneider Heh,听起来不错。它也适用于电锯:你最好不要用电锯代替玻璃罐的盖子。可读性。。。有时要多得多