[英]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.