首頁 >後端開發 >C++ >為什麼 C 11 Lambda 中的按值捕獲需要'mutable”關鍵字?

為什麼 C 11 Lambda 中的按值捕獲需要'mutable”關鍵字?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-07 00:04:111007瀏覽

Why is the `mutable` Keyword Necessary for Capture-by-Value in C  11 Lambdas?

探索C 11 Lambda 在按值捕獲中對「可變」的要求

在C 11 中,按值捕獲的lambda 在功能上是不可變的,這意味著它們無法修改預設捕獲的值。為了修改這種行為,使用「mutable」關鍵字來允許在 lambda 範圍內進行修改。

考慮以下範例:

int main() {
    int n;
    [&]() { n = 10; }(); // OK, captures by reference

    [=]() mutable { n = 20; }(); // OK, captures by value with "mutable"

    // [=](){n = 10;}(); // Error, cannot modify by-value capture without "mutable"

    std::cout << n << "\n"; // Prints "10"
}

問題出現了:為什麼是「mutable」以值擷取所需的關鍵字?

傳統上,傳遞給命名函數的參數是隱式可變的,允許在 功能。然而,lambda 提供了按引用捕獲和按值捕獲機制,這引入了不同的行為。

預設情況下,按值擷取會建立外部變數的副本,且 lambda 只能對該臨時值進行操作。如果沒有“mutable”,任何修改捕獲值的嘗試都會導致編譯器錯誤,因為它違反了函數物件的不變性原則。

因此,引入“mutable”關鍵字來明確允許修改按值捕獲的 lambda。它向編譯器發出信號,表明捕獲的副本可以被視為可變的,從而返回到更傳統的類似函數的行為。

總之,C 中的按值捕獲需要「mutable」關鍵字11 個 lambda,因為它確保函數物件的輸出與其輸入保持一致,同時允許在 lambda 範圍內修改捕獲的副本。

以上是為什麼 C 11 Lambda 中的按值捕獲需要'mutable”關鍵字?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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