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