使用bit_cast在C ++ 20中将整数转换为GLvoid *是否有效?

ant*_*rds 4 c++ opengl casting c++20

上一个问题曾问过如何在整数类型和GLvoid*C ++ 11之间进行转换(基于该问题的标签),但是在这里我对C ++ 20感兴趣。

现在,std::bit_cast可以选择进行类型转换了,我想知道这是否是将整数与OpenGL函数结合使用的“正确”方法,而OpenGL函数由于历史原因需要使用a GLvoid*来表示字节偏移量(例如glDrawRangeElements),或者应改用上一个问题引用的方法。

Nic*_*las 6

bit_cast这绝对是错误的事情。void*不需要与大多数整数类型相同。bit_cast 要求源类型和目标类型具有完全相同的大小。因此,在32位系统上,a std::bit_cast<void*>(24ull)是编译错误。在64位系统上,一个简单std::bit_cast<void*>(24)的错误就是编译错误。

并且甚至uintptr_t不需要具有与指针相同的大小;只是它至少具有和指针一样多的位。如果还有更多,那么bit_cast它会cho死。

只是做了reinterpret_cast<void*>,如果你不喜欢使用C样式转换。


Dav*_*ing 5

不会,尽管(使用适当大小的整数)它通常会在实践中起作用,而且无论如何都不能严格遵循。这是一个C API,因此(void*)offset(在C中)表示。如果您的工具链具有预期的C兼容性,则可以用C ++编写,在这种情况下,它等效于reinterpret_cast<void*>(offset),但不一定等效bit_cast<void*>(offset)(即使reinterpret_cast不这样也保留位模式,并且另外要求sizeof offset==sizeof(void*))。