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