深入研究C 11 Lambda 以值擷取:揭示「Mutable」關鍵字的必要性
在C 11 中,lambda 表達式提供創建匿名函數物件的強大機制。然而,當按值捕獲時,臭名昭著的“mutable”關鍵字經常出現,讓開發人員對其目的感到疑惑。
考慮以下程式碼片段:
#include <iostream> int main() { int n; [&](){n = 10;}(); // OK [=]() mutable {n = 20;}(); // OK // [=](){n = 10;}(); // Error: a by-value capture cannot be modified in a non-mutable lambda std::cout << n << "\n"; // "10" }
中沒有「mutable」關鍵字第二個 lambda,編譯器報告錯誤。問題來了:為什麼這個關鍵字是必要的?
函數物件的隱式契約
Lambda 表達式是函數物件的實例。函數物件應遵守函數式程式設計的基本原則:引用透明性。這意味著當使用同一組參數呼叫時,結果應該始終相同。
按值擷取時,lambda 表達式會建立變數的本機副本。然而,這帶來了一個潛在的問題。如果 lambda 修改了副本,則原始變數的值可能會更改,違反了引用透明度原則。
使用「Mutable」強制引用
「mutable」關鍵字打破了這個隱含的契約。透過指定它,編譯器允許 lambda 表達式修改捕獲的值。這使開發人員能夠明確控制 lambda 的可變性和副作用。
如果沒有“可變”,編譯器會透過阻止 lambda 修改任何捕獲的值來強制引用透明性。這可以確保 lambda 對於給定的參數集始終傳回相同的結果,使其成為真正的函數物件。
達到平衡
「mutable」關鍵字在引用透明度和修改捕獲值的靈活性之間提供了必要的平衡。它允許開發者選擇 lambda 是否可以影響外界。
因此,按值捕獲 lambda 中的「mutable」關鍵字不僅僅是一種約定,而且是保留函數物件的基本性質:可靠且可預測的行為。
以上是C 11 Lambda 以值擷取何時需要「mutable」關鍵字?的詳細內容。更多資訊請關注PHP中文網其他相關文章!