我试图用C++实现Python中的高阶函数:
def add1(x):
def helper():
nonlocal x
x += 1
return x
return helper
以下是我创建的三个版本:
^{pr2}$输出包括:
101
102
103
-------------------------------------------
4239465
4239466
4239467
-------------------------------------------
4201325
4201325
4201325
只有add1v1符合我想要的。谁能给我解释一下原因吗?在
原因是这是未定义的行为。在
内部lambda通过引用捕获
x
。在问题是一旦
add()
返回,它的参数就会被销毁,而返回的lambda有一个指向已销毁对象的悬挂引用。在lambda必须按值捕获
x
;在我看来,您真正要做的是一个mutable lambda:请注意,在随后复制返回的lambda时,这种方法具有一定的含义;但是只要返回的lambda在其剩余的生命周期中保持“在一个位置”,所得到的语义可能就是您所期望的。在
不是答案,如果将参数签名更改为add1\u v*(int&x),似乎所有版本的函数都能正常工作
所有这些都是格式错误的,因为您在lambda中通过引用捕获
x
,但是x
是一个局部变量,当退出函数add
时,它将被销毁,然后引用变为挂起,对它的取消引用会导致UB,这意味着任何事情都有可能;即使第一种情况似乎也能正常工作。在相关问题 更多 >
编程相关推荐