为什么 std::functions 在捕获的变量超出范围后从 lambdas 创建的工作?
Why do std::functions created from lambdas work after captured variables go out of scope?
前几天我在搞lambdas和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 无关,常规函数也可以 return 引用已析构的变量。和 lambda 一样,它是未定义的行为,并且数字具有随机值 and/or 崩溃。
前几天我在搞lambdas和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 无关,常规函数也可以 return 引用已析构的变量。和 lambda 一样,它是未定义的行为,并且数字具有随机值 and/or 崩溃。