繁体   English   中英

在constexpr中将`void *`转换为`unsigned int`

[英]convert `void*` to `unsigned int` in constexpr

一个人不能在constexpr中做一个reinterpret_cast<unsigned int>(void*) ,所以我尝试了类似的东西;

constexpr bool is_null(void* ptr)
{
    return ptr == nullptr;
}

constexpr unsigned int get_id(void* ptr)
{
    return is_null(ptr) ? 0 : 1 + get_id(static_cast<char*>(ptr) - 1);
}

但是我在编译时遇到错误,关于ptr == nullptr不是constexpr,但仅在递归调用中,而不是我删除它。 那么,如果可能的话,我如何在编译时将void*转换为unsigned int

在编译时地址常量表达式由“符号+加数”表示跟踪,例如:

int x[5];

constexpr int* p = x + 3 - 1;

假设int是4个字节, p是symbol = x,addend = 2 * 4 = 8个字节。 p = x + 8。

因此,您只能对具有相同符号的地址常量表达式执行指针操作,因为在转换期间不知道它们的最终相对地址是什么。 此外,加数可能不会超出对象,主要是为了安全,但也因为您可能最终为null。 例如,假设x在地址4000小数处分配。 然后x-1000将是一个空指针表达式,但直到链接时才知道。

标准中的规则旨在支持此表示。 可以对它们执行的常量操作反映了此表示下可用的信息。

另请注意,链接时甚至不知道非静态存储持续时间的变量的绝对地址,自动存储持续时间对象具有与每个函数调用不同的堆栈相对地址,并且动态存储持续时间对象具有已确定的堆地址在运行时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM