reinterpret_cast几乎没用吗?

Cha*_*l72 16 c++ pointers casting reinterpret-cast type-punning

我已经阅读了之前有关使用的reinterpret_cast各种问题,并且我还阅读了C++标准中的相关措辞.本质上,它归结为指针到指针reinterpret_cast操作的结果不能安全地用于除了被回送到原始指针类型之外的任何东西.

然而,在实践中,大多数现实世界的使用reinterpret_cast似乎都是基于(错误的)假设,即a reinterpret_cast与C风格的演员表相同.例如,我见过很多的代码,它使用reinterpret_cast从投char*unsigned char*的字符集转换程序的目的.这是完全无害的,但严格来说,它不是便携式-有没有保证,一个reinterpret_cast来自char*unsigned char*当您尝试取消引用不会崩溃您的程序unsigned char*指针.

根据标准,似乎唯一的其他实际用途reinterpret_cast有任何真正的保证,是从指针转换为整数,反之亦然.

然而,在许多情况下,我们希望(并且应该能够)在不同的指针类型之间安全地进行转换.例如:uint16_t*到新的C++ 0x char16_t*,或者实际上是指向与原始类型相同大小/对齐的基本数据类型的任何指针.然而,reinterpret_cast并不保证这应该起作用.

问题:如何安全地在指向相同大小/对齐的基本数据类型的指针之间进行转换,例如char*- > unsigned char*?既然reinterpret_cast似乎并不保证这实际上有效,那么C风格的演员是唯一安全的选择吗?

Joh*_*itb 11

当您尝试取消引用unsigned char*指针时,无法保证从char*到unsigned char*的reinterpret_cast不会使程序崩溃.

你不能以任何其他方式进行这样的转换,所以你必须要相信你的编译器对这个完全合理的转换做了什么.

由于reinterpret_cast似乎并不能保证这实际上有效,因此C风格的转换是唯一安全的选择吗?

C风格的演员表只会映射到reinterpret_cast它,所以它将完全相同.在某些时候,你必须信任你的编译器.标准有一个限制,它只是简单地说"不.阅读你的编译器手册".当涉及到交叉投射指针时,这就是这一点.它允许您char使用unsigned char左值读取.无法将a char*转换为可用的编译器unsigned char*几乎无法使用,因此不存在.

  • “_所以你必须相信编译器对这个完全合理的转换所做的事情_”查找“traits::length(reinterpret_cast<const char*>(s))”:标准库假定相同的“信任”。哈哈 (2认同)