了解C 11 Lambda 以值擷取對「可變」的需求
C 11 中的Lambda 表達式提供兩種捕獲模式:按引用捕獲和按值捕獲。當按值捕獲變數時,lambda 可以修改它們。然而,這種行為並不是自動的。需要“mutable”關鍵字才能允許修改。
「Mutable」要求背後的基本原理
lambda 與傳統命名函數之間的一個關鍵區別在於lambda 的設計封裝一組對本地臨時狀態進行操作的操作。預設情況下,此狀態應在 lambda 執行過程中保持不變。
透過允許修改按值捕獲變數而不“可變”,lambda 將違反函數確定性原則。無論周圍程式碼的狀態如何,每次呼叫 lambda 時都應產生相同的輸出。修改按值擷取變數會引入不確定性,使得 lambda 的行為難以預測。
了解按值捕獲
按值捕獲是旨在創建捕獲變數的本地副本。該副本旨在是不可變的,以確保 lambda 的行為保持一致。但是,在某些情況下,lambda 可能需要更改捕獲變數的副本。
例如,請考慮以下程式碼:
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 會擷取按值無法修改“n”的副本。這確保了輸出保持一致,即使 lambda 的執行修改了原始的「n」變數。
透過使用“mutable”,我們明確指示允許 lambda 修改捕獲的副本。這允許我們更改 lambda 中「n」的副本,而不影響封閉函數的行為。
以上是為什麼在 C 11 Lambda 中修改捕獲的變數需要'mutable”關鍵字?的詳細內容。更多資訊請關注PHP中文網其他相關文章!