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
相关产品推荐
相关产品推荐

