reinterpret_cast转换void*未达预期,求解析原因
为什么reinterpret_cast得到的引用没有指向void*指针的值?
问题根源分析
你的核心错误在于误解了reinterpret_cast的作用对象:它直接操作你传入的变量的内存本身,而非变量存储的值。
第一种写法的问题
auto & s = reinterpret_cast<It &>(t.p);
这里的t.p是一个void*类型的变量,它自身占用栈上的一块内存(地址是&t.p,即输出中的0x7ffd4fbaca00)。reinterpret_cast<It&>(t.p)的行为是把这块存储指针的内存直接解释为It类型的引用,所以s的地址自然就是&t.p,和你看到的输出一致。你想要的是t.p的值(即0x7ffd4fbaca08)指向的内存,而非t.p变量自己的内存。
第二种写法的问题
auto a = t.p; auto & s = reinterpret_cast<It &>(a);
auto a = t.p创建了一个临时的void*变量a,它拷贝了t.p的值。此时reinterpret_cast<It&>(a)是把临时变量a的内存地址解释为It类型的引用,输出中的0x7ffc31e65570就是a在栈上的存储位置,和t的地址接近只是栈变量布局的巧合。
正确的写法
要让引用指向t.p的值所指向的内存,你需要先把void*转换为目标类型的指针,再通过指针获取引用:
auto& s = *reinterpret_cast<It*>(t.p);
这里reinterpret_cast<It*>(t.p)把t.p的值(即指向t.x的地址)转换为It*类型的指针,解引用后得到该地址对应内存的It&引用。此时运行输出会显示&s等于t.p的值,符合你的预期。
补充说明
reinterpret_cast是C++中最“粗暴”的类型转换,它完全不做类型检查,只是在二进制层面把一段内存的内容当成目标类型。你必须明确传递给它的是目标内存的地址,而非存储地址的变量本身,才能得到正确的引用。
内容的提问来源于stack exchange,提问作者Ashley Duncan
相关产品推荐
相关产品推荐

