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

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

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-07 00:04:111002浏览

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

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