gpt4 book ai didi

c++ - c++11 lambda 真的支持闭包吗?函数变量中存在语义冲突

转载 作者:太空狗 更新时间:2023-10-29 19:57:07 24 4
gpt4 key购买 nike

我个人觉得C++11 lambda和C/C++函数有一些冲突,函数局部变量的生命以函数结束,但是在FP中,lambda是一个对象因此它的变量的生命周期只要 lambda 。

我有一个小测试

#include<stdio.h>
int main()
{
auto f=[](int input){
int local=3;
return [=](int x){return input+local+x;};
};
auto f1=f(3);
auto f2=f(4);

printf("%d,%d\n",f1(2),f2(2));
return 0;
}

g++ -std=c++11,它打印“8,9”

这是我对 FP 的期望,但对于 C 语言范围,它的行为应该是“未定义的”,因为“input”和“local”都在“f”声明后消失。

所以问题:

For both input parameter and internal variable, does lambda object store them somewhere to make sure, they are still available after lambda definition? Or my test is undefined behavior?

谢谢。

最佳答案

Lambda 将捕获的对象存储在自身中。如果您通过引用捕获,您会保留引用并需要确保您没有对悬空的引用进行操作。如果您通过拷贝捕获(如您在示例中所做的那样),则无需关心原始对象,因为无论如何您都不会在 lambda 初始化之后使用它们。

Lambda 是未命名的类,但它们可以非常接近于普通类;您的示例可以使用 unnamed 类(而不是实际未命名的 lambda)重写,如下所示:

int main()
{
auto f=[](int input){
int local=3;
struct unnamed {
unnamed(int input, int local) : input(input), local(local) {}
auto operator()(int x) const { return input + local + x; }
int input, local;
};
return unnamed(input, local);
};
auto f1=f(3);
auto f2=f(4);

printf("%d,%d\n",f1(2),f2(2));
return 0;
}

上面的行为也符合您的预期:demo

关于c++ - c++11 lambda 真的支持闭包吗?函数变量中存在语义冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40860574/

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