4

我是 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”?

4

2 回答 2

2

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

来自MSDN

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

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

a 的结果reinterpret_cast不能安全地用于除 >cast back to its original type 之外的任何事情。其他用途充其量是不可移植的。


在你的例子中

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

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

于 2013-05-26T05:52:45.213 回答
0

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

于 2013-05-26T05:58:04.920 回答