You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中reinterpret_cast转换int*&为void*&的行为是否符合标准?

结论

这段代码的行为属于未定义行为,C++标准没有对其表现做任何保证。

原因说明
  • 你用reinterpret_cast<void*&>(source_and_result)的本质,是让一个void*类型的左值引用直接绑定到int*类型的对象上,这违反了C++的严格别名规则。
  • C++标准仅允许有限的几种别名场景是合法的:比如用char/unsigned char/std::byte类型引用别名任意对象,或者基类引用绑定派生类对象等。int*和void*是完全独立的两种指针类型,不属于合法的别名范围。
  • 虽然在绝大多数常用硬件平台上,int*和void*的内存布局、大小、赋值操作的底层实现完全一致,这段代码大概率能正常运行,但这只是平台和编译器的实现惯例,不属于C++标准强制要求的内容。如果遇到指针表示不同的特殊平台,或者编译器开启了高等级严格别名优化,代码完全可能出现预期外的错误。
符合标准的修改方案

你可以调整重载函数的实现,规避引用转换的问题,就能得到明确定义的行为:

void reallocate_something(int *&source_and_result, size_t size) {
    void* tmp = source_and_result;
    reallocate_something(tmp, size);
    source_and_result = static_cast<int*>(tmp);
}

这个写法先把int*值转换为void*传递,拿到新地址后再安全转换回int*赋值给原引用,全程没有别名违规,完全符合C++标准要求。

内容的提问来源于stack exchange,提问作者kabanus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 00:15:03