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