c++ - 为什么这个 reinterpret_cast 不编译?

标签 c++ casting reinterpret-cast

我知道 reinterpret_cast 是危险的,我这样做只是为了测试它。我有以下代码:

int x = 0;
double y = reinterpret_cast<double>(x);

当我尝试编译程序时,它给了我一个错误提示

invalid cast from type 'float' to type 'double

发生了什么事?我认为 reinterpret_cast 是你可以用来将苹果转换为潜艇的流氓 Actor ,为什么这个简单的 Actor 不能编译?

最佳答案

在 C++ 中,reinterpret_cast 只能执行一组特定的转换,在语言规范中明确列出。简而言之,reinterpret_cast 只能执行指针到指针的转换和引用到引用的转换(加上指针到整数和整数到指针的转换)。这与转换名称中表达的意图一致:它旨在用于指针/引用的重新解释。

你想要做的不是重新解释。如果您想将 int 重新解释为 double,则必须将其转换为引用类型

double y = reinterpret_cast<double&>(x); 

虽然等效的基于指针的重新解释可能更明确

double y = *reinterpret_cast<double*>(&x); // same as above

请注意,虽然 reinterpret_cast 可以转换引用/指针类型,但实际尝试通过生成的引用/指针读取数据会产生未定义的行为。

在任何情况下,这当然在具有不同大小的 intdouble 的平台上没有多大意义(因为如果 double 你将读取超出 x 占用的内存)。

所以,最终这一切都归结为您想要实现的目标。内存重新诠释?看上面。某种更有意义的 intdouble 转换?如果是这样,reinterpret_cast 在这里帮不了你。

关于c++ - 为什么这个 reinterpret_cast 不编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2205353/

相关文章:

apache-flex - Flex 3.2 转换问题

c++ - reinterpret_cast for 'serializing' 数据,接收端的字节顺序和对齐方式

c++ - reinterpret_cast 类型双关实际上是未定义的行为吗?

c++ - 以标准输入作为文件名参数的 fopen

c++ - 是否有任何可静态链接的 C++ 发行版兼容的 HTTP/HTTPS 库?

java - 可以添加一个可以转换为现有最终类的新类吗?

c++ - 为什么忽略 std::optional 的强制转换运算符?

c++ - 将指针强制转换为整数、递增该整数,然后强制转换回来是否安全?

c++ - 为什么在insert函数调用中不能直接使用返回指针作为参数?

c++ - 如何将crc-32修改为crc-32/mpeg-2