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