I've recently learned我可以这样做:
auto a = +[]{return true;};
a = +[]{return false;};
并且理解无捕获的lambda衰减到函数指针as confirmed by GCC:
bool (*)()
但实际的功能对象存储在哪里? 它是如何被释放的?为什么我可以存储指向临时lambda的指针?我理解常量引用延长对象生命周期的语言的角落情况,所以我期望lambda衰减到那种类型,而不是原始指针。
答案 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"
基本相同,但更详细。