9

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

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

除了 reinterpret_cast,我还可以使用 C 风格(const char*)。使用 reinterpret_cast 有什么特别的理由吗?我阅读了其他一些不赞成 reinterpret_cast 的帖子。但是上面的用法是合法的,不能用其他东西代替,对吧?

4

4 回答 4

14

C-Style casts 的问题在于它们在幕后做了很多事情。详细解释见这里:http: //anteru.net/2007/12/18/200/

您应该尝试始终使用 C++ 强制转换,从长远来看会使生活更轻松。在这种情况下,C 风格强制转换的主要问题是您可以编写(char*)(&v)while with reinterpret_cast,您需要一个额外const_cast的 ,所以它更安全一些。另外,您可以使用正则表达式轻松找到reinterpret_cast,这对于 C 风格的演员表是不可能的。

于 2011-12-08T06:34:18.123 回答
6

没有区别。在给定的情况下,C 风格的演员表正是“重新解释”演员表。

您应该更喜欢 C++ 风格的强制转换的原因是它们明确说明了它们正在强制转换的内容。如有必要,C 风格的强制转换将始终尝试使用最粗略的强制强制转换,而 C++ 风格的强制转换仅在可能的情况下编译:静态强制转换仅在值可转换或指针/引用时成功是兼容的,并且 const-cast 仅在源和目标是彼此的 cv 限定版本时才有效。reinterpret-cast 明确表示您希望检查底层二进制表示。(请注意,唯一有效的重新解释转换通常是那些指向void 或 char 指针的转换,除非它们是一些更大的诡计的一部分。)

于 2011-12-08T06:42:19.627 回答
4

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 风格的转换不会给人那种印象。

于 2011-12-08T07:01:38.730 回答
1

reinterpret_cast当它被用来替换 astatic_castdynamic_cast. 鼓励使用它来替换 C 转换。

新的演员表比 C 风格的演员表有好处。一方面,你可以限制你真正想要的演员,另一方面,对新演员进行文本搜索比 C 演员容易得多。

于 2011-12-08T06:40:41.353 回答