前几天我正在乱搞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';
}
答案 0 :(得分:7)
这与lambdas无关,常规函数也可以返回对被破坏变量的引用。和lambda一样,它是未定义的行为,数字具有随机值和/或崩溃。