gpt4 book ai didi

python - 在 C++14 中使用泛型 lambda 和自动返回类型特性获得的不同结果

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

我正在尝试使用 C++ 在 python 中实现这段高阶函数:

def add1(x):
def helper():
nonlocal x
x += 1
return x
return helper

这是我创建的三个版本:

#include <iostream>
#include <functional>

using namespace std;

function<int(void)> add1_v1(int x) {
function<int(void)> g = [&x]() {return ++x;};
return g;
}

auto add1_v2(int x) {
function<int(void)> g = [&x]() {return ++x;};
return g;
}

auto add1_v3(int x) {
auto g = [&x]() {return ++x;};
return g;
}

int main() {
auto a = add1_v1(100);
auto b = add1_v2(100);
auto c = add1_v3(100);
for(int i = 0; i < 3; ++i) {
cout << a() << endl;
}
cout << "-------------------------------------------" << endl;
for(int i = 0; i < 3; ++i) {
cout << b() << endl;
}
cout << "-------------------------------------------" << endl;
for(int i = 0; i < 3; ++i) {
cout << c() << endl;
}
return 0;
}

输出是:

101
102
103
-------------------------------------------
4239465
4239466
4239467
-------------------------------------------
4201325
4201325
4201325

只有 add1_v1 符合我的要求。谁能帮我解释一下原因?

最佳答案

原因是这是未定义的行为。

内部 lambda 通过引用捕获 x

问题是一旦 add() 返回,它的参数就被销毁,并且返回的 lambda 有一个对已销毁对象的悬空引用。

lambda 必须按值捕获 x;在我看来你真正想在这里做的是 mutable lambda :

auto add(int x) {
function<int(void)> g = [x]() mutable {return ++x;};
return g;
}

请注意,在随后复制返回的 lambda 时,这种方法会产生一定的影响;但只要返回的 lambda 在其剩余的生命周期中保持“在一个地方”,由此产生的语义可能就是您所期望的。

关于python - 在 C++14 中使用泛型 lambda 和自动返回类型特性获得的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42127517/

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