簡體   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