我应该使用c++的reinterpret_cast而不是C风格的强制转换吗?

Should I use a C++ reinterpret_cast over a C-style cast?

本文关键字:风格 转换 c++ reinterpret 我应该 cast      更新时间:2023-10-16

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

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

我也可以使用c风格的(const char*)来代替reinterpret_cast。使用reinterpret_cast有什么特别的原因吗?我读了其他一些帖子,其中reinterpret_cast是不受欢迎的。但是上面的用法是合法的,不能用其他东西代替,对吗?

c风格强制转换的问题在于它们在底层做了很多工作。查看这里的详细说明:http://anteru.net/2007/12/18/200/

您应该尝试始终使用c++强制类型转换,从长远来看,这会使生活更轻松。在这种情况下,c风格强制转换的主要问题是,您可以编写(char*)(&v),而使用reinterpret_cast,您将需要额外的const_cast,因此它更安全。此外,您可以轻松地使用正则表达式找到reinterpret_cast,这对于c风格的强制转换是不可能的。

没有区别。在给定的情况下,c风格的强制转换恰恰是一种"重新解释"强制转换。

您应该选择c++风格的强制转换的原因是它们显式说明它们要强制转换的内容。如果有必要,C风格的强制转换总是会尝试使用最原始的强制转换,而c++风格的强制转换只在可能的情况下才会编译:静态强制转换只有在值可转换或指针/引用兼容时才会成功,而const强制转换只有在源和目标是彼此的cv限定版本时才有效。重新解释强制转换显式地声明您希望检查底层二进制表示。(请注意,唯一有效的重新解释转换通常是那些转换为 void-或char-pointer,除非它们是一些更大的诡计的一部分。)

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

dynamic_cast(expression) -允许在适当的类层次之间进行类型转换。

const_cast(expression) -去掉const-ness。

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

reinterpret_cast(expression) -如果仍然不满足要求,则可以使用。C风格的强制转换,但带有名称。因此,在大型代码库中很容易找到它。

注意:-大多数"reinterpret_cast"可以通过适当的设计消除。换句话说,"reinterpret_cast"是必需的,很可能是设计中出了问题。

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

reinterpret_cast当它被用来代替static_castdynamic_cast时是不赞成的。建议使用它来替换C强制转换。

新的强制类型转换比c风格的强制类型转换有好处。一方面,您可以限制实际需要的类型转换,另一方面,对新的类型转换进行文本搜索比对C类型转换进行文本搜索要容易得多。