首页 > 后端开发 > C++ > C 11 Lambda 按值捕获何时需要'mutable”关键字?

C 11 Lambda 按值捕获何时需要'mutable”关键字?

DDD
发布: 2024-11-29 04:22:13
原创
684 人浏览过

When is the `mutable` Keyword Necessary in C  11 Lambda Capture-by-Value?

深入研究 C 11 Lambda 按值捕获:揭示“Mutable”关键字的必要性

在 C 11 中,lambda 表达式提供创建匿名函数对象的强大机制。然而,当按值捕获时,臭名昭著的“mutable”关键字经常出现,让开发人员对其目的感到疑惑。

考虑以下代码片段:

#include <iostream>

int main() {
    int n;
    [&amp;](){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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板