gpt4 book ai didi

c++ - 内部静态和捕获的可变之间的 Lambda 状态行为差异

转载 作者:行者123 更新时间:2023-11-30 05:16:46 25 4
gpt4 key购买 nike

我注意到创建一个 lambda 然后进行复制会导致在 lambda 中声明的静态变量和由值可变变量捕获的静态变量之间存在不同的行为。具体来说,当 lambda 被复制时,可变的状态被复制并变得独立于它被复制的 lambda。但是,lambda 内部静态的值在拷贝之间共享状态。

#include <iostream>

int main()
{
int i = 0;
auto f = [i]() mutable {
static int h=0;
std::cout << "mutable captured i by value=" << ++i << " static h=" << ++h << std::endl;
};
f(); // mutable captured i by value=1 static h=1
i = 10; // This shows that, as expected, changes in i are ignored by fc
auto fc = f;
f(); // mutable captured i by value=2 static h=2
f(); // mutable captured i by value=3 static h=3
fc(); // mutable captured i by value=2 static h=4
}

由此我了解到,lambda 的拷贝共享相同的执行代码和任何保留状态,而且可变捕获值不会在同一 lambda 的重复实例之间共享,即使它们在调用之间保留。

这种行为是否正确?我找到了 this关于 lambda 中的静态,但还没有遇到状态行为的这种差异。

最佳答案

static lambda 中的变量的行为与在其他地方声明的变量相同。

按值捕获的变量表现为 lambda 闭包类型的非静态数据成员。默认情况下,这些成员在 lambda 主体中被视为 constmutable 的作用是删除 const。但在任何情况下,它们的行为都像用户定义类中的成员一样。

因此,捕获和 static 局部变量是完全不同的东西。后者不受 mutable 的影响。

关于c++ - 内部静态和捕获的可变之间的 Lambda 状态行为差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42477692/

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