解碼神奇的「 」運算子:理解「 []{}」 Lambda
在一個令人困惑的觀察中,一個令人困惑的觀察中,一個令人困惑的觀察中,一個單獨的「 」前綴C 中的lambda 表達式奇蹟般地實現了其重新分配。這個神秘的魔法引發了一個問題:為什麼下面的程式碼能夠編譯成功?
int main() { auto test = +[]{}; // The "+" operator casts a lambda to a function pointer test = []{}; }
答案就在 C 標準的晦澀深處。 “” 觸發 lambda 到普通舊函數指標的轉換。 lambda 是非捕獲的,本質上擁有到具有相同簽名的函數指標的轉換函數。此轉換函數依照 C 標準中的定義,傳回與 lambda 的函數呼叫運算子行為相同的函數的位址。
一元 " " 運算符,當應用於 lambda 產生的閉包物件時,涉及一組內建重載。這些重載之一接受任何指標類型並將其轉換為函數指標。因此,閉包類型到函數指標(唯一候選重載函數)的轉換具有優先權。
因此,「auto test = []{};」中「test」的型別被推導為「void(*)()」。這種函數指標相容性使得可以將第二個 lambda/closure 物件指派給“test”,即使它們的閉包類型不同。
這些知識揭示了「[]{}」lambda 成功背後的秘密。透過將 lambda 轉換為函數指針,它繞過了重新定義 lambda 的限制,解鎖了分配新 lambda 物件的能力。
以上是為什麼 `[]{}` 在 C 中啟用 Lambda 重新分配?的詳細內容。更多資訊請關注PHP中文網其他相關文章!