gpt4 book ai didi

c++ - Lambda 按值捕获和 "mutable"关键字

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:18:56 25 4
gpt4 key购买 nike

lambda 中对关键字 mutable 的需求是造成极大困惑的根源。

考虑代码:

int x = 10;

function<void()> lambda = [=]() mutable {x++; cout << "Inside lambda: x = " << x << "\n";};

cout << "Before lambda: x = " << x << "\n";
lambda();
cout << "After lambda: x = " << x << "\n\n";

输出:

Before lambda: x = 10
Inside lambda: x = 11
After lambda: x = 10

正如我们所见,变量 x 在 lambda 之后保持不变,因此没有副作用。

但是,如果我们“忘记”了关键字 mutable,就会出现错误。

作为 C++ 中默认的按值传递参数,对我来说需要 mutable 关键字没有意义。

有人可以编写(即使是伪代码)编译器生成的类来代替 lambda 吗?

谢谢

最佳答案

如前所述here mutable 说明符允许 lambda 修改复制捕获的参数并调用它们的非常量成员函数。它不会影响通过引用捕获的变量。

Can someone write (even in pseudo code) the class generated by the compiler, in place of the lambda?

给出一般情况并不容易,但我们可以定义在您的特定情况下有效的内容。
生成的类可能如下所示:

struct Lambda {
void operator()() { x++; }
int x{10};
};

如果删除 mutable 说明符,则函数运算符定义为 const:

struct Lambda {
void operator()() const { x++; }
int x{10};
};

为简单起见,我用给定值 (10) 初始化了 x 并将其公开,但显然它是通过使用从周围上下文捕获的变量进行复制初始化的,并且无法从函数外部访问运算符。
它的类型也是从用于初始化它的变量中推导出来的,就像你这样做一样:

auto lambda_x = x;

参见 here了解更多详情。

关于c++ - Lambda 按值捕获和 "mutable"关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42056454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com