簡體   English   中英

為什么我不能將 void* static_cast 轉換為函數指針?

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

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