首頁 > 後端開發 > C++ > 為什麼 `[]{}` 在 C 中啟用 Lambda 重新分配?

為什麼 `[]{}` 在 C 中啟用 Lambda 重新分配?

Linda Hamilton
發布: 2024-12-28 05:34:09
原創
264 人瀏覽過

Why Does ` []{}` Enable Lambda Reassignment in C  ?

解碼神奇的「 」運算子:理解「 []{}」 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中文網其他相關文章!

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