Is reinterpret_cast
这样做是安全的,这是最好的方法吗?
例如,在下面的代码中,我有一个名为ibytestream
,这允许读取uint16_t
s and int16_t
是从它。ibytestream::next
is a vector<unsigned char>::iterator
.
inline ibytestream& operator>>(ibytestream& stream, uint16_t& data) {
data = 0;
data |= *stream.next++;
data <<= 8;
data |= *stream.next++;
return stream;
}
inline ibytestream& operator>>(ibytestream& stream, int16_t& data) {
return stream >> reinterpret_cast<uint16_t&>(data);
}
我不想重复将字节转换为整数的代码,所以我使用了reinterpret_cast
让签名版本重用未签名版本中的代码。它在我的机器上运行良好,但它在其他现代机器上通常也能运行吗?
是的,这很安全。
该标准的三个部分适用于做出此决定:
- 有符号和无符号类型的对齐要求相同
- 允许在指向具有相同对齐要求的类型的指针之间进行指针转换
- 当执行泛左值之间的转换时,如果相应指针之间的转换有效,则转换有效。
对于每个标准有符号整数类型,都存在相应的(但不同的)标准无符号整数类型:unsigned char
, unsigned short int
, unsigned int
, unsigned long int
,
and unsigned long long int
,每个占用相同的存储量并且具有相同的对齐要求。
对象指针可以显式转换为不同类型的对象指针。将“指向 T1 的指针”类型的纯右值转换为“指向 T2 的指针”类型(其中 T1 和 T2 是对象类型,并且 T2 的对齐要求并不比 T1 更严格)并返回其原始类型,从而生成原始类型指针值。
如果可以使用reinterpret_cast将“指向T1的指针”类型的表达式显式转换为“指向T2的指针”类型,则类型T1的泛左值表达式可以转换为“对T2的引用”类型。结果参考
与源泛左值相同的对象,但具有指定的类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)