首頁 > 後端開發 > C++ > C 11 Lambda 表達式的真實類型是什麼?

C 11 Lambda 表達式的真實類型是什麼?

Susan Sarandon
發布: 2024-12-10 10:06:12
原創
284 人瀏覽過

What is the True Type of a C  11 Lambda Expression?

C 11 中使用「auto」進行Lambda 類型推論

C 11 中lambda 表達式的類型存在爭議,有些人認為相信它是一個函數指標。但是,請考慮以下示範:

#define LAMBDA [] (int i) -> long { return 0; }
int main()
{
    long (*pFptr)(int) = LAMBDA;  // ok
    auto pAuto = LAMBDA;  // ok
    assert(typeid(pFptr) == typeid(pAuto));  // assertion fails !
}
登入後複製

此程式碼與 lambda 具有函數指標類型的假設相矛盾。那麼,它們類型的真實本質是什麼?

揭開 Lambda 的真實身分

與普遍看法相反,lambda 表達式具有未指定的類型。它們只是函子的語法便利。在編譯過程中,lambda 會轉換為函子:

  • [] 括號內的元素成為建構函數參數和函子物件成員。
  • () 中包含的參數將轉換為函子的運算子()。

沒有變數捕獲(空 [] 括號)的 Lambda 在技術上可以是轉換為函數指標。然而,並非所有編譯器(例如 MSVC2010)都支援這種轉換。

重要區別

雖然不捕獲任何變數的 lambda 可以充當函數指針,其基礎類型仍未指定。它不是函數指針,而是未指定的函子類型。

以上是C 11 Lambda 表達式的真實類型是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板