C lambda表达式 – 编译器如何解释它们?

C lambda表达式 – 编译器如何解释它们?,第1张

概述我刚刚开始学习C 11中的新功能.我正在阅读C Primer(Stanley Lippman)中的lambdas,并正在尝试它们. 我尝试了以下代码: auto func() -> int (*) (){ //int c=0; return []()-> int {return 0;};}int main(){ auto p = func();} 这段代码编译得很好 我刚刚开始学习C 11中的新功能.我正在阅读C Primer(Stanley lippman)中的lambdas,并正在尝试它们.

我尝试了以下代码:

auto func() -> int (*) (){    //int c=0;    return []()-> int {return 0;};}int main(){    auto p = func();}

这段代码编译得很好.所以我猜没有任何捕获的lambdas只是由编译器生成为普通函数,我们可以使用它们的普通函数指针.

现在我更改了代码以使用捕获:

auto func() -> int (*) (){    int c=0;    return [=]()-> int {return c;};}int main(){    auto p = func();}

但这无法编译.使用g时出现以下编译错误:

main.cpp: In function ‘int (* func())()’:main.cpp:6:31: error: cannot convert ‘func()::__lambda0’ to ‘int (*)()’ in returnreturn [=]()-> int {return c;};

从错误我可以理解,它不是一个生成的普通函数,它可能是一个带有重载调用 *** 作符的类.或者是别的什么?

我的问题:编译器如何在内部处理lambdas?我应该如何传递使用捕获的lambda,即func()的返回值应该是什么?我目前无法想到一个用例,我需要使用这样的lambdas,但我只是想了解更多关于它们的信息.请帮忙.

谢谢.

解决方法 所有lambda都是具有实现定义类型的函数对象,称为闭包类型,带有operator()成员.每个lambda表达式都有它自己独特的闭包类型.

没有捕获的Lambda可以转换为函数指针.编译器是否在幕后生成正常函数是内部细节,对您来说无关紧要.

无法返回在函数内定义的lambda.很少有东西阻止这种情况 – 你不知道一种lambda表达式的名称,你不能在decltype中使用lambda表达式,并且如前所述,两个lambda表达式(即使词法相同)具有不同的类型.

你可以做的是使用std :: function:

std::function<int()> func(){    int i = 0;    return [=]()-> int {return i;};}

这种方式也适用于捕获.

或类似的东西:

auto f = []{ return 0; };auto func() -> decltype(f){    return f;}

编辑:然而,即将推出的C 1y标准(更具体地说,返回类型扣除)将允许您这样做:

auto func(){    int i = 42;    return [=]{ return i; };   }
总结

以上是内存溢出为你收集整理的C lambda表达式 – 编译器如何解释它们?全部内容,希望文章能够帮你解决C lambda表达式 – 编译器如何解释它们?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1241433.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存