簡體   English   中英

將c ++ lambda復制到函數指針引用

[英]Copying c++ lambda to Function Pointer reference

我不確定在以下情況下是否定義了行為:

我的函數指針類型:

typedef void (*DoAfter_cb_type)(void);

應該分配回調的函數:

void DoSomething(DoAfter_cb_type & DoAfter_cb)
{
    //...
    DoAfter_cb =  [](){
        //...
    };
}

呼叫者:

DoAfter_cb_type DoAfter_cb = nullptr;

DoSomething(DoAfter_cb);

// Here is something that has to be done after DoSomething but before DoAfter_cb.

if( DoAfter_cb != nullptr){
    DoAfter_cb();
}

正如我在這里學到的 lambdas可以隱式轉換為函數指針。

然而thoose仍然是指針,我擔心調用lambda的重要內容存儲在堆棧上,如果我只返回函數指針,它將超出范圍

我必須使用函數指針,因為我無法在我的環境中訪問std :: function。 使用std :: function我希望lambda對象存儲在引用變量中,我不會有任何問題。

行為是否相同如果我只是定義一個普通的函數或者我有任何副作用嗎?

行為是否相同如果我只是定義一個普通的函數或者我有任何副作用嗎?

是的,它是一樣的。 無捕獲的lambda可以轉換為常規函數指針,因為引用C ++標准( [expr.prim.lambda.closure] / 6 ,強調我的):

沒有lambda-capture的非泛型lambda表達式的閉包類型有一個轉換函數指向函數,C ++語言鏈接具有與閉包類型的函數調用操作符相同的參數和返回類型。 如果函數調用操作符具有非拋出異常規范,則轉換為“指向noexcept函數的指針”。 此轉換函數返回的值是函數F的地址,在調用時,它與調用閉包類型的函數調用運算符具有相同的效果。

因此,當lambda超出范圍時,該指針由適當的函數支持,就像您自己在文件范圍內編寫它一樣。 函數在程序的整個執行過程中“生效”,因此指針始終有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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