我有以下模板函数用于将任何标准类型的数据转储到二进制输出流中。
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不受欢迎。但上述用法是合法的,不能用其他任何东西替换,对吗?
由于
答案 0 :(得分:14)
C-Style演员的问题在于他们在幕后做了很多事。有关详细说明,请参见此处:http://anteru.net/2007/12/18/200/
您应该尝试始终使用C ++ - 强制转换,从长远来看,让生活变得更轻松。在这种情况下,C风格的演员表的主要问题是你可以在(char*)(&v)
时写reinterpret_cast
,你需要额外的const_cast
,所以它更安全一些。另外,您可以使用正则表达式轻松找到reinterpret_cast
,这对于C风格的演员表是不可能的。
答案 1 :(得分:5)
没有区别。在给定的情况下,C风格的演员阵容恰恰是“重新解释”的广播。
你更喜欢使用C ++风格的演员表是因为他们显式关于他们的演员。如果有必要,C风格的强制转换将始终尝试回退最粗糙的强制转换,而C ++风格的强制转换仅在可能的情况下编译:如果值可转换或指针/引用,静态强制转换只会成功是兼容的,只有当源和目标是彼此的cv限定版本时,const-cast才有效。重新解释转换明确指出您希望检查基础二进制表示。 (注意,唯一有效的重新解释 - 强制转换通常是那些到 void-或char-pointer,除非它们是更大的欺骗的一部分。)
答案 2 :(得分:3)
dynamic_cast(expression) - 允许在适当的类层次结构之间进行转换。
const_cast(expression) - 抛弃const-ness。
static_cast(expression) - 在某种程度上是C风格,但仍然尊重类型之间的某些不兼容性,并且不允许。
reinterpret_cast(expression) - 如果仍然不满足要求,则可以使用。 C风格的铸造,但有一个名字。所以在大型代码库中很容易找到它。
注意: - 大多数&#34; reinterpret_cast&#34;可以通过适当的设计消除。换句话说,&#34; reinterpret_cast&#34;需要的手段,最有可能的是设计中的错误。
更新: 这应该是最后一个选项,在上面的情况下,使用是正确的。现在提到reinterpret_cast会给读者一种印象,即作者故意选择不关心类型安全。但是使用c风格的投射不会给人留下这样的印象。
答案 3 :(得分:1)
reinterpret_cast
在用于替换static_cast
或dynamic_cast
时不赞成。鼓励用它来代替C演员。
新演员阵容比C型演员阵容更有优势。首先,你可以限制你真正想要的演员阵容,对于另一个,你可以更容易地对新剧组进行文本搜索而不是C演员。