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