首页 >后端开发 >C++ >为什么在 C 11 Lambda 中修改捕获的变量需要'mutable”关键字?

为什么在 C 11 Lambda 中修改捕获的变量需要'mutable”关键字?

Barbara Streisand
Barbara Streisand原创
2024-11-28 11:10:14718浏览

Why Is the `mutable` Keyword Necessary for Modifying Captured Variables in C  11 Lambdas?

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn