#include <functional>
std::function<void()> s_capture_void_int;
void capture_void_int (const std::function<void(int)>& param)
{
s_capture_void_int = [param]() {
param(1);
};
}
void capture_local_lambda()
{
auto local_lambda = [](int) {
};
s_capture_void_int = [local_lambda]() {
local_lambda(1);
};
}
int main() {
//Case 1: this works
auto func2 = [](int){};
{
std::function<void(int)> func2_fn(func2);
s_capture_void_int = [func2_fn]() { func2_fn(1); };
}
s_capture_void_int();
//case 2: even this works.
capture_local_lambda();
s_capture_void_int();
//case 3: but this fails.
auto func3 = [](int){};
{
std::function<void(int)> func3_fn(func3);
capture_void_int(func3_fn);
}
s_capture_void_int(); //<- it crashes here
return 0;
}
I2luY2x1ZGUgPGZ1bmN0aW9uYWw+CgoKc3RkOjpmdW5jdGlvbjx2b2lkKCk+IHNfY2FwdHVyZV92b2lkX2ludDsKdm9pZCBjYXB0dXJlX3ZvaWRfaW50IChjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50KT4mIHBhcmFtKQp7CiAgICBzX2NhcHR1cmVfdm9pZF9pbnQgPSBbcGFyYW1dKCkgewogICAgICAgIHBhcmFtKDEpOwogICAgfTsKfQp2b2lkIGNhcHR1cmVfbG9jYWxfbGFtYmRhKCkKewogICAgYXV0byBsb2NhbF9sYW1iZGEgPSBbXShpbnQpIHsKICAgIH07CiAgICBzX2NhcHR1cmVfdm9pZF9pbnQgPSBbbG9jYWxfbGFtYmRhXSgpIHsKICAgICAgICBsb2NhbF9sYW1iZGEoMSk7CiAgICB9Owp9CgppbnQgbWFpbigpIHsKICAgIC8vQ2FzZSAxOiB0aGlzIHdvcmtzCiAgICBhdXRvIGZ1bmMyID0gW10oaW50KXt9OwogICAgewogICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQpPiBmdW5jMl9mbihmdW5jMik7CiAgICAgICAgc19jYXB0dXJlX3ZvaWRfaW50ID0gW2Z1bmMyX2ZuXSgpIHsgZnVuYzJfZm4oMSk7IH07CiAgICB9CiAgICBzX2NhcHR1cmVfdm9pZF9pbnQoKTsKCiAgICAvL2Nhc2UgMjogZXZlbiB0aGlzIHdvcmtzLgogICAgY2FwdHVyZV9sb2NhbF9sYW1iZGEoKTsKICAgIHNfY2FwdHVyZV92b2lkX2ludCgpOwoKICAgIC8vY2FzZSAzOiBidXQgdGhpcyBmYWlscy4KICAgIGF1dG8gZnVuYzMgPSBbXShpbnQpe307CiAgICB7CiAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGludCk+IGZ1bmMzX2ZuKGZ1bmMzKTsKICAgICAgICBjYXB0dXJlX3ZvaWRfaW50KGZ1bmMzX2ZuKTsKICAgIH0KICAgIHNfY2FwdHVyZV92b2lkX2ludCgpOyAvLzwtIGl0IGNyYXNoZXMgaGVyZQoJcmV0dXJuIDA7Cn0=