我已经阅读了关于使用 reinterpret_cast
的各种之前的问题,并且也阅读了相关的 C++ 标准措辞。本质上,问题在于指针转换操作的 reinterpret_cast
结果不能安全地用于除了强制转换回原始指针类型之外的任何其他目的。
然而,在实践中,大多数对 reinterpret_cast
的真实世界用途似乎都基于(错误的)假设,即 reinterpret_cast
与 C 风格转换相同。例如,我看过很多代码使用 reinterpret_cast
将 char*
转换为 unsigned char*
,以进行字符集转换函数。这完全无害,但严格来说不可移植 - 没有保证从 char*
到 unsigned char*
的 reinterpret_cast
在您尝试解引用 unsigned char*
指针时不会崩溃程序。
根据标准,reinterpret_cast
仅有唯一另一个具有任何真实保证的用途是将指针转换为整数,反之亦然。
然而,有很多情况下我们希望(并且应该能够)在不同的指针类型之间进行安全转换。例如:uint16_t*
到 新的 C++0x char16_t*
,或者基本数据类型的任何指针,其大小/对齐方式与原始类型相同。但是,reinterpret_cast
并不保证这应该起作用。
问题:我们如何安全地在指针之间进行转换,这些指针指向相同大小/对齐方式的基本数据类型,比如char*
--> unsigned char*
?由于reinterpret_cast
似乎不能保证实际有效,C风格的转换是唯一安全的选择吗?