衰变的lambda指向存储的函数在哪里?它是如何被释放的?

时间:2016-07-28 02:05:25

标签: c++ memory lambda

I've recently learned我可以这样做:

auto a = +[]{return true;};
a = +[]{return false;};

并且理解无捕获的lambda衰减到函数指针as confirmed by GCC

bool (*)()

但实际的功能对象存储在哪里? 它是如何被释放的?为什么我可以存储指向临时lambda的指针?我理解常量引用延长对象生命周期的语言的角落情况,所以我期望lambda衰减到那种类型,而不是原始指针。

1 个答案:

答案 0 :(得分:4)

lambda不是指针,但可以转换为指向函数的指针。

函数不像C ++中的值那样“存储”。实际上,它们存在于可执行文件的代码段中,并由可执行文件/ dll加载器加载到写保护的执行位集页面中。

无状态lambda的代码也不例外。转换只返回一个指向函数的指针,其效果与lambda的主体相同,不多也不少。

请记住,这只适用于无状态的lambdas。没有要存储的非静态数据。

现在,YYYY事情是一个小技巧,因为当你将一元+应用于一个对象时,会尝试转换,并且一个uniqie类型(将函数对象转换为函数)找到指针。

我猜具体的代码可能有所帮助。

operator+

现在struct fake_lambda { static void action(){ std::cout<<"hello?\n"; } void operator()()const{action();} using ptr=void(*)(); operator ptr()const{return &fake_lambda::action;} }; 是指向打印auto f=+fake_lambda{};的函数的指针。

这与"hello?\n"基本相同,但更详细。