将任意整数转换为 void*
Casting an arbitrary integer to void*
最近我遇到了这样做的代码:
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
。通常重新解释转换是一件危险的事情,但它确实保证了转换到中间类型,然后回到原始类型,将始终产生原始值。因此,在规定的约束下,您的代码是可以的。
相关文章:
- Boost buffer_cast 无法从 void* 转换为 PointerToPodType
- 将void*转换为某种类型的shared_ptr
- 如何将 void* 转换为函数指针?
- 对 C++ 中的特定标头使用 extern C 关键字是否允许从 void* 转换为 char*?
- 如何将 void 转换为 typedef void(..)(浮动)
- 无法将参数 1 从"int (__thiscall A::* *)(void)"转换为"int (__cdecl *)(void)"
- 从 'void *' 转换为 'const std::string *&' 必须具有所有中间指针 const 合格
- x = malloc(n * sizeof (int));无法将 void 转换为 int
- 错误:请求从“ void”转换为“ QString”的非量表类型
- 使用 LLVM 从 const void * 转换为模板类型时出现问题
- 如何修复错误:请求从"void"转换为非标量类型"std::vector<int>"
- void* 转换为基类并调用虚函数
- 将 void* 转换为 std::function<void()>
- 无法将参数 4 从 'void' 转换为'const char *'
- C++11 无法将 std::condition_variable::wait 从 'void' 转换为 'bool'
- 如何在 C++11 中将"const void*"转换为函数指针?
- 似乎无法在 c++ 中将 void* 转换为结构
- 将 void 转换为字节
- void * 转换为 int 语法的问题
- C++从类型“void*”转换为类型“double”无效