C++ 将任意整数强制转换为无效*

C++ 将任意整数强制转换为无效*,c++,pointers,integer,c++17,reinterpret-cast,C++,Pointers,Integer,C++17,Reinterpret Cast,最近我遇到了这样的代码: static_assert(sizeof(void*) >= sizeof(size_t)); size_t idx = get_index_to_array(); void* ptr = (void*)idx; 基本上使用第三方库提供的void*指针将索引存储到数组中以保存分配 假设指针在任何点都不会被解引用或释放/删除,并且只用于返回到原始值,这个代码严格遵守C++(如果C++的17标准,如果这很重要)?< /P> < P>如你所说,这个void*指针除了

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

static_assert(sizeof(void*) >= sizeof(size_t));

size_t idx = get_index_to_array();
void* ptr = (void*)idx;
基本上使用第三方库提供的
void*
指针将索引存储到数组中以保存分配


假设指针在任何点都不会被解引用或释放/删除,并且只用于返回到原始值,这个代码严格遵守C++(如果C++的17标准,如果这很重要)?< /P> < P>如你所说,这个

void*
指针除了被转换回
int
之外,不会用于任何事情,那么是的,这个代码就可以了

当所有其他强制转换失败时(例如
静态\u强制转换
),C样式强制转换为
(void*)idx
)。通常,重新解释强制转换是一件危险的事情,但它确实保证了将强制转换为中间类型,然后返回到原始类型,将始终产生原始值。因此,在规定的约束条件下,您的代码很好

AsUME,指针不会在任何点被撤销或释放/删除,只用于返回原始值,这个代码严格遵守C++(如果C++的17标准,如果重要的话)? 它是一致的

由于没有兼容的静态转换,这种显式类型转换(通俗地称为C样式转换)执行重新解释转换。其中,标准规定(引用最新草案):

[expr.reinterpret.cast]

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


您可能想看看,其中谈到了
uintpttr\t
,“基本上使用由第三方提供的无效指针”是可以的,如果它带有保证的话。是吗?别名?@TedLyngmo 1)你有任何证据支持这一说法吗?它在某些编译器上“只起作用”这一事实并不意味着它严格符合标准。2) 在问题中指出,指针除了在需要时将其返回到大小外,不会以任何其他方式进行操纵。你应该问的是“这样做有什么好处吗?”我肯定想不出来any@SidS我可以。许多C API都提供了一个函数来注册对事件的回调。这种回调通常会有一个选项,以空指针的形式传递用户定义的数据。如果该数据恰好是一个整数,作为一个次要优化,您可以通过重新解释该整数而不是将指针传递给单独的对象来避免间接寻址。这一保证仅适用于指针->足够大的整数->指针,而不适用于其他方式(对于任何大小的整数)。“一致性”和在这里“工作”可能无法恢复整数。