将任意整数转换为 void*

Casting an arbitrary integer to void*

本文关键字:void 转换 任意 整数      更新时间:2023-10-16

最近我遇到了这样做的代码:

static_assert(sizeof(void*) >= sizeof(size_t));
size_t idx = get_index_to_array();
void* ptr = (void*)idx;

本质上是使用第三方库提供的void*指针将索引存储到数组中以保存分配。

假设指针在任何时候都不会被取消引用或释放/删除,并且仅用于强制转换为原始值,那么此代码是否严格遵守C++(根据 C++17 标准,如果这很重要(?

假设指针在任何时候都不会被取消引用或释放/删除,并且仅用于转换回原始值,那么此代码是否严格遵守C++(根据 C++17 标准,如果这很重要(?

它是符合的。

由于没有兼容的静态强制转换,因此此显式类型转换(俗称 C 样式强制转换(执行重新解释转换。其中,该标准说(引用最新草案(:

[重新诠释]

整型或枚举类型的值可以显式转换为指针。 转换为足够大小的整数(如果实现中存在任何此类整数(并返回到相同指针类型的指针将具有其原始值;指针和整数之间的映射由实现定义。

如果,正如你所说,这个void*指针除了被投射回int之外不会用于任何事情,那么是的,这段代码很好。

(void*)idx中的 C 样式转换在所有其他转换失败(如static_cast(时回退到reinterpret_cast。通常重新解释转换是一件危险的事情,但它确实保证了转换到中间类型,然后回到原始类型,将始终产生原始值。因此,在规定的约束下,您的代码是可以的。