在C++ 14中使用通用LAMBDAS和自动返回类型特征获得的不同结果

2024-09-28 17:04:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用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符合我想要的。谁能给我解释一下原因吗?在


Tags: 函数版本helperreturndef原因pr2试图用
3条回答

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

内部lambda通过引用捕获x。在

问题是一旦add()返回,它的参数就会被销毁,而返回的lambda有一个指向已销毁对象的悬挂引用。在

lambda必须按值捕获x;在我看来,您真正要做的是一个mutable lambda

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

请注意,在随后复制返回的lambda时,这种方法具有一定的含义;但是只要返回的lambda在其剩余的生命周期中保持“在一个位置”,所得到的语义可能就是您所期望的。在

不是答案,如果将参数签名更改为add1\u v*(int&x),似乎所有版本的函数都能正常工作

所有这些都是格式错误的,因为您在lambda中通过引用捕获x,但是x是一个局部变量,当退出函数add时,它将被销毁,然后引用变为挂起,对它的取消引用会导致UB,这意味着任何事情都有可能;即使第一种情况似乎也能正常工作。在

相关问题 更多 >