深入研究 C 11 Lambda 按值捕获:揭示“Mutable”关键字的必要性
在 C 11 中,lambda 表达式提供创建匿名函数对象的强大机制。然而,当按值捕获时,臭名昭著的“mutable”关键字经常出现,让开发人员对其目的感到疑惑。
考虑以下代码片段:
#include <iostream> 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,编译器报告错误。问题来了:为什么这个关键字是必要的?
函数对象的隐式契约
Lambda 表达式是函数对象的实例。函数对象应遵守函数式编程的基本原则:引用透明性。这意味着当使用同一组参数调用时,结果应该始终相同。
按值捕获时,lambda 表达式会创建变量的本地副本。然而,这带来了一个潜在的问题。如果 lambda 修改了副本,则原始变量的值可能会更改,从而违反了引用透明度原则。
使用“Mutable”强制引用
“mutable”关键字打破了这个隐含的契约。通过指定它,编译器允许 lambda 表达式修改捕获的值。这使开发人员能够显式控制 lambda 的可变性和副作用。
如果没有“可变”,编译器会通过阻止 lambda 修改任何捕获的值来强制引用透明性。这可以确保 lambda 对于给定的参数集始终返回相同的结果,使其成为真正的函数对象。
达到平衡
“mutable”关键字在引用透明度和修改捕获值的灵活性之间提供了必要的平衡。它允许开发者选择 lambda 是否可以影响外界。
因此,按值捕获 lambda 中的“mutable”关键字不仅仅是一种约定,而且是保留函数对象的基本性质:可靠且可预测的行为。
以上是C 11 Lambda 按值捕获何时需要'mutable”关键字?的详细内容。更多信息请关注PHP中文网其他相关文章!