[英]Why can I not cast a lambda to void* then to a function pointer?
我有一種特殊情況,由於類型擦除,我需要將lambda轉換為void *以便存儲它。
對於第一種情況,一切都按預期工作,而對於第二種情況,一切都沒有預期,我想知道如何解決它,以及是否將此行為定義為開始。
int main()
{
auto lambda = [](int x){
std::cerr << x << std::endl;
};
//Cast lambda to void*
void* vptr = static_cast<void*>(&lambda);
//Cast vptr back to lambda and call it
(*static_cast<decltype(&lambda)>(vptr))(10); //<--- Ok, compiles and works
//Cast vptr to function pointer
(*static_cast<void(**)(int)>(vptr))(10); //<--- Compiles but segmentation fault
return 0;
}
Lambda不是函數-它是具有operator()
成員的隱藏類類型的實例。 因此,將lambda的地址強制轉換為函數指針將永遠無法進行。
要么使用第一種方法(有效),要么最好更改周圍的環境,以使此要求完全消失。 因為瘋了
非捕獲lambda衰減到函數指針,例如:
#include<functional>
int main() {
using Fn = void(*)();
using Fnp = void(**)();
Fn fn = [](){ };
Fnp p = &fn;
(*p)();
}
不捕獲lambda。
您可以利用此功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.