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中文網其他相關文章!