簡體   English   中英

為什么不能將lambda轉換為void *,然后轉換為函數指針?

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

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