簡體   English   中英

function 指針地址在轉換后是否保持不變?

[英]Do function pointer addresses hold after conversions?

據我了解,C++ 標准允許將 function 指針轉換為不同的類型(只要從不調用它們):

int my_func(int v) { return v; }

int main() {
    using from_type = int(int);
    using to_type = void(void);

    from_type *from = &my_func;
    to_type *to = reinterpret_cast<to_type *>(from);

    // ...
}

此外,如果我將指針轉換回其原始類型並調用它,則沒有未定義的行為。

到目前為止,一切都很好。 那么接下來呢?

const bool eq = (to == reinterpret_cast<to_type *>(my_func));

轉換后地址是否也保留,或者標准不保證這一點?


雖然這與問題無關,但一種可能的情況是當一個人在類型擦除上努力時。 如果地址成立,則無需知道原始 function 類型即可完成某些操作。

來自[expr.reinterpret.cast].6 (強調我的):

function 指針可以顯式轉換為不同類型的 function 指針。 [...]

除了將“指向 T1 的指針”類型的純右值轉換為“指向 T2 的指針”類型(其中 T1 和 T2 是 function 類型)並返回其原始類型產生原始指針值外,這種指針轉換的結果是未指定的.

因此,該標准明確允許將 function 指針轉換為不同的 FP 類型,然后返回。 這是未指定reinterpret_cast ing function 指針的一般規則的例外。

在我的理解中,這意味着to == reinterpret_cast<to_type *>(my_func)不一定是true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM