根据我的经验,似乎:
- 在函数调用中创建的 lambda 表达式在调用后立即销毁
- 调用期望 a 的函数
std::function
会从 lambda 中创建一个临时对象 (std::function),并且该对象在调用后被销毁
可以通过以下代码片段观察到此行为:
const function<void()>* pointer;
void a(const function<void()> & f)
{
pointer = &f;
}
void b()
{
(*pointer)();
}
int main()
{
int value = 1;
std::cout << &value << std::endl;
// 1: this works
function<void()> f = [&] () { std::cout << &value << std::endl; };
a(f);
// 2: this doesn't
a([&] () { std::cout << &value << std::endl; });
/* modify the stack*/
char data[1024];
for (int i = 0; i < 1024; i++)
data[i] = i % 4;
b();
return 0;
}
在第二种情况下到底发生了什么?是否有正确的调用方法a()
而不创建显式std::function
对象?
编辑: : 这两个版本(1 和 2)编译得恰到好处,但会产生不同的输出:
版本 1:
0x7fffa70148c8
0x7fffa70148c8
版本 2:
0x7fffa70148c8
0