首页 > 后端开发 > C++ > 为什么 C 11 Lambda 中的按值捕获需要'mutable”关键字?

为什么 C 11 Lambda 中的按值捕获需要'mutable”关键字?

Mary-Kate Olsen
发布: 2024-12-07 00:04:11
原创
1007 人浏览过

Why is the `mutable` Keyword Necessary for Capture-by-Value in C  11 Lambdas?

探索 C 11 Lambda 在按值捕获中对“可变”的要求

在 C 11 中,按值捕获的 lambda 在功能上是不可变的,这意味着它们无法修改默认捕获的值。为了修改这种行为,使用“mutable”关键字来允许在 lambda 范围内进行修改。

考虑以下示例:

int main() {
    int n;
    [&]() { n = 10; }(); // OK, captures by reference

    [=]() mutable { n = 20; }(); // OK, captures by value with "mutable"

    // [=](){n = 10;}(); // Error, cannot modify by-value capture without "mutable"

    std::cout << n << "\n"; // Prints "10"
}
登录后复制

问题出现了:为什么是“mutable”按值捕获所需的关键字?

传统上,传递给命名函数的参数是隐式可变的,允许在 功能。然而,lambda 提供了按引用捕获和按值捕获机制,这引入了不同的行为。

默认情况下,按值捕获会创建外部变量的副本,并且 lambda 只能对该临时值进行操作。如果没有“mutable”,任何修改捕获值的尝试都会导致编译器错误,因为它违反了函数对象的不变性原则。

因此,引入“mutable”关键字来显式允许修改按值捕获的 lambda。它向编译器发出信号,表明捕获的副本可以被视为可变的,从而返回到更传统的类似函数的行为。

总之,C 中的按值捕获需要“mutable”关键字11 个 lambda,因为它确保函数对象的输出与其输入保持一致,同时允许在 lambda 范围内修改捕获的副本。

以上是为什么 C 11 Lambda 中的按值捕获需要'mutable”关键字?的详细内容。更多信息请关注PHP中文网其他相关文章!

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