C 11 中的可變性和Lambda 按值捕獲
C 11 中的Lambda 表達式允許捕獲外部變量,可以透過參考或按值。但是,當按值捕獲時,預設需要 mutable 關鍵字。這引發了關於其必要性的問題,特別是考慮到傳遞給命名函數的傳統參數不需要可變性。
可變性背後的基本原理
關鍵區別在於lambda 作為函數物件的本質。它們旨在每次調用時產生一致的結果。如果 lambda 表達式可以更改其捕獲的變數而不將其宣告為可變的,則它將違反此原則。因此,編譯器預設假設按值捕獲變數應保持不變。
可變聲明
可變關鍵字允許明確修改捕獲 - lambda 表達式中的按值變數。它承認函數物件旨在根據其當前狀態表現出不同的行為。例如,下面的lambda 每次執行時都會遞增一個計數器:
int n = 0; [mutable](){ n++; }();
含義和替代方案
按值捕獲中的可變性要求可確保lambda保持確定性行為。在許多情況下,當捕獲的變數不打算從外部修改時,它還消除了透過引用捕獲的需要。然而,值得注意的是,過度使用 mutable 會妨礙程式碼清晰度並引入潛在的副作用。
以上是為什麼預設會按值捕獲的 C 11 Lambda 是可變的?的詳細內容。更多資訊請關注PHP中文網其他相關文章!