【问题标题】:What is the purpose of reinterpret_cast [duplicate]reinterpret_cast 的目的是什么[重复]
【发布时间】:2013-05-21 07:57:17
【问题描述】:

我是 C++ 新手,阅读一些代码如下:

template<typename T>
std::istream & read(std::istream* stream, T& value){
    return stream->read(reinterpret_cast<char*>(&value), sizeof(T));
}

然后调用它:

size_t size;
read(&stream, size);

谁能解释这里使用 reinterpret_cast 的目的是什么以及调用 read 函数后的结果是什么?

更新:

问题是:

如果流包含一个字符串,例如“test”,在调用read之后,值的类型变成char *,它的内容是“test”?

【问题讨论】:

  • Google 是您的朋友。试试reinterpret_cast c++,看看第二个和第三个结果。
  • 该代码 sn-p 似乎是在尝试编写通用序列化例程。如果事实确实如此,那么所显示的方法是相当幼稚和危险的。
  • @In silico 如果流中包含字符串,例如“test”,调用read后,value的类型变成char *,内容为“test”?
  • @KenWhite 第二个和第三个 google 结果可能因用户、地区或日常而不同。
  • @justin:说得好,但这并不能改变基本搜索就能回答这个问题的事实。

标签: c++


【解决方案1】:

reinterpret_cast&lt;T&gt;() 强制将给定的位模式解释为您想要的类型。是演员阵容中最“残酷”的。

来自MSDN

允许将任何指针转换为任何其他指针类型。还允许将任何整数类型转换为任何指针类型,反之亦然。

误用 reinterpret_cast 操作符很容易导致不安全。除非所需的 >conversion 本质上是低级的,否则您应该使用其他强制转换运算符之一。 reinterpret_cast 运算符可用于诸如char*int* 或>One_class*Unrelated_class* 的转换,这些转换本质上是不安全的。

reinterpret_cast 的结果除了被 > 转换回其原始类型外,不能安全地用于其他任何事情。其他用途充其量是不可移植的。


在你的例子中

template<typename T>
std::istream & read(std::istream* stream, T& value){
    return stream->read(reinterpret_cast<char*>(&value), sizeof(T));
}

它用于从给定的流中读取数据并将读取的数据转换为char*以将其视为字节序列(假设char默认为无符号)。

【讨论】:

  • 好的,完成...不知道语法。谢谢你的提示。
【解决方案2】:

read 函数只是将一些字节读入缓冲区,而这里的reinterpret_cast 通过覆盖值的实际类型将任意右值转换为这样的缓冲区。如果流确实包含正确类型的值,则结果是该值存储到value

【讨论】:

  • 如果流中包含字符串,例如“test”,调用read后,value的类型变成char *,内容为“test”?
  • value 改变它的类型,但是是的,如果调用这个函数时 value 的类型是 char[5],并且流包含 5 个字节 ’t’, ‘e’, ’s’, ’t’, ‘\0’,那么 value 确实会包含“test”(字符串不是这个例程的好应用,因为它们通常不是固定长度的,如果是,就不会写终止符)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 2011-12-02
  • 2015-09-10
相关资源
最近更新 更多