gpt4 book ai didi

c++ - 为什么从 lambdas 创建的 std::functions 在捕获的变量超出范围后工作?

转载 作者:太空宇宙 更新时间:2023-11-04 15:17:11 27 4
gpt4 key购买 nike

前几天我在研究 lambda 和 std::functions,发现了一个奇怪的属性。它们在捕获的变量超出范围后仍然有效。

这里有一个例子来说明我的意思。

#include <iostream>
#include <functional>

std::function<void()> make_lambda()
{
int a = 10;

return [&a](){std::cout << a << std::endl;};
}

int main()
{

auto fun = make_lambda();

fun();

}

在我看来,这似乎是行不通的,a 是通过引用捕获的,而引用已经消失了。

编辑:

好的。这个问题不仅与 lambada 有关,而且与所有在使用前删除的引用有关。

我的问题变了。我仍然会在大量使用堆栈时得到类似的行为,这一定会覆盖旧数据。这是我的新代码:

#include <iostream>

int& make()
{
int a = 10;


return a;
}

void flushStack(long long i)
{
if (i == 0)
{
return;
}
flushStack(i-1);
}

int main()
{

int& i = make();


std::cout << i++ << '\n';
std::cout << i++ << '\n';
std::cout << i++ << '\n';
std::cout << i++ << '\n';
std::cout << i++ << '\n';

flushStack(5000000);

std::cout << "\n\n\n";

std::cout << i++ << '\n';
std::cout << i++ << '\n';
std::cout << i++ << '\n';
std::cout << i++ << '\n';
std::cout << i++ << '\n';


}

最佳答案

这与 lambda 无关,常规函数也可以返回对已析构变量的引用。和 lambda 一样,它是未定义的行为,并且数字具有随机值和/或崩溃。

关于c++ - 为什么从 lambdas 创建的 std::functions 在捕获的变量超出范围后工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29859612/

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