[英]Why can't I static_cast a void* to a pointer-to-function?
這可以被編譯(盡管是 UB(對吧?)因為fvp == nullptr
)
int f;
void* fvp{};
decltype(f)* fp = static_cast<decltype(f)*>(fvp);
但這不能
void f() {}
void* fvp{};
decltype(f)* fp = static_cast<decltype(f)*>(fvp);
因為(Clang 說)
不允許從“void *”到“decltype(f) ”(又名“void ( )()”)的 Static_cast [bad_cxx_cast_generic]
為什么會這樣? 我從標准的哪里理解這一點? 我想[expr.static.cast]是我應該看的地方; 特別是7 ,但我不確定。
關於我想問這個的原因的后續問題。
這是不允許的,因為 [expr.static_cast] 不允許。 事實上,相關的語言是:
不得使用
static_cast
顯式執行其他轉換。
由於沒有列出允許從void*
轉換為 function 指針類型的轉換,因此不允許進行該轉換。
理由是 function 和數據指針可能有不同的大小或 alignment 要求。
您可能會考慮reinterpret_cast
,它有條件地支持此類轉換。 但最好使用不需要此類轉換的設計。 如果您需要類型擦除 function 指針,您仍然需要reinterpret_cast
但可以使用例如void(*)()
作為擦除類型,它始終受到支持。
我從標准的哪里可以理解這一點? 我想 [expr.static.cast] 是我應該看的地方; 具體是 7,但我不確定
基本上,不能保證void*
和 function 指針之間的完整往返。
這可以從expr.reinterpret.cast#8中看出:
有條件地支持將 function 指針轉換為 object 指針類型,反之亦然。 這種轉換的含義是實現定義的,除非實現支持雙向轉換,將一種類型的純右值轉換為另一種類型並返回,可能具有不同的 cv 限定,應產生原始指針值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.