首頁 >後端開發 >C++ >為什麼在 C 11 Lambda 中修改捕獲的變數需要'mutable”關鍵字?

為什麼在 C 11 Lambda 中修改捕獲的變數需要'mutable”關鍵字?

Barbara Streisand
Barbara Streisand原創
2024-11-28 11:10:14696瀏覽

Why Is the `mutable` Keyword Necessary for Modifying Captured Variables in C  11 Lambdas?

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn