繁体   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