首頁 > 後端開發 > C++ > C 11 Lambda 以值擷取何時需要「mutable」關鍵字?

C 11 Lambda 以值擷取何時需要「mutable」關鍵字?

DDD
發布: 2024-11-29 04:22:13
原創
684 人瀏覽過

When is the `mutable` Keyword Necessary in C  11 Lambda Capture-by-Value?

深入研究C 11 Lambda 以值擷取:揭示「Mutable」關鍵字的必要性

在C 11 中,lambda 表達式提供創建匿名函數物件的強大機制。然而,當按值捕獲時,臭名昭著的“mutable”關鍵字經常出現,讓開發人員對其目的感到疑惑。

考慮以下程式碼片段:

#include <iostream>

int main() {
    int n;
    [&amp;](){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中文網其他相關文章!

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