c-style cast vs reinterpret_cast

she*_*har 8 c++ casting reinterpret-cast

我有以下模板函数用于将任何标准类型的数据转储到二进制输出流中.

template<typename T> static void
dump ( const T& v, ostream& o ) {
    o.write ( reinterpret_cast<const char*>(&v), sizeof(T));
}
Run Code Online (Sandbox Code Playgroud)

我也可以使用C风格(const char*)代替reinterpret_cast.有没有特别的理由使用reinterpret_cast?我读了一些其他帖子,其中reinterpret_cast不受欢迎.但上述用法是合法的,不能用其他任何东西替换,对吧?

谢谢

Ant*_*eru 14

C-Style演员阵容的问题在于他们在幕后做了很多事情.有关详细说明,请参见此处:http://anteru.net/2007/12/18/200/

您应该尝试始终使用C++ - 强制转换,从长远来看使生活更轻松.与C风格的主要问题投射在这种情况下,你可以写(char*)(&v),同时用reinterpret_cast,你就需要一个额外的const_cast,所以这是一个更加安全.此外,您可以轻松找到reinterpret_cast正则表达式,这对于C风格的演员阵容是不可能的.

  • 阿格斯,是的.我开始说你不能正则表达式为C风格演员,然后句子反过来;) (3认同)
  • 你甚至不需要为`reinterpret_cast`提供一个完整的正则表达式,一个简单的文本搜索(在大多数编辑器上很好的"查找")就足够了:) (2认同)

Ker*_* SB 6

没有区别.在给定的情况下,C风格的演员阵容正是"重新诠释".

你更喜欢C++风格的演员表是因为他们明确表达了他们的演员.如果必要的话,C风格的强制转换将总是试图回到最粗糙的强制转换,而C++风格的强制转换仅在可能的情况下编译:如果值可转换或指针/引用,静态强制转换只会成功是兼容的,只有当源和目标是彼此的cv限定版本时,const-cast才有效.重新解释转换明确指出您希望检查基础二进制表示.(请注意,唯一有效的重新解释,铸件通常是那些无空隙或字符指针,除非他们是一些较大的挂羊头卖狗肉的一部分.)


rak*_*esh 5

C风格的铸造是非常非常危险的。因此,C++ 根据典型用法将转换分为以下类型:

Dynamic_cast(表达式) - 允许在适当的类层次结构之间进行转换。

const_cast(表达式) - 抛弃 const 性。

static_cast(表达式) - 在一定程度上是 C 风格,但仍然尊重类型之间的一些不兼容性并且不允许。

reinterpret_cast(表达式) - 如果仍然不满足要求,则可以使用此方法。C 风格的铸造,但有名字。因此,在大型代码库中很容易找到它。

注意:- 大多数“reinterpret_cast”可以通过适当的设计来消除。换句话说,需要“reinterpret_cast”意味着设计中很可能存在错误。

更新:这应该是最后一个选项,在上面的情况下,用法是正确的。现在提到reinterpret_cast会给读者这样的印象:作者故意选择不关心类型安全。但使用 c 风格的转换不会给人这种印象。