C 11 lambda表达式 – 捕获与参数传递

C 11 lambda表达式 – 捕获与参数传递,第1张

概述考虑比较正整数的函数;该函数本身使用lambda来做这个工作. // Pass n1, n2 by value to the lambda.bool Compare(int n1, int n2) { return [](int n1, int n2) { return n1 > n2; };} 上面的代码段编译好了虽然Compare()总是返回true; 但是,以下代码甚至无法编译 考虑比较正整数的函数;该函数本身使用lambda来做这个工作.
// Pass n1,n2 by value to the lambda.bool Compare(int n1,int n2) {    return [](int n1,int n2) { return n1 > n2; };}

上面的代码段编译好了虽然Compare()总是返回true;

但是,以下代码甚至无法编译 –

// capturing valuesbool Compare(int n1,int n2) {    return [n1,n2]() -> bool { return n1 > n2; };}

并返回错误

lambda.cpp:48:46: error: cannot convert 'Compare(int,int)::__lambda2' to 'bool' in   return  return [n1,n2]() -> bool { return n1 > n2; };

可能这些不是在C中引入lambda的意图,仍然…

为什么第一个总是返回true?
为什么第二次无法编译?

解决方法

Why the first one always returns true?

Lambdas衰减为函数指针,它们隐式转换为布尔(对于lambdas,始终为true,因为指针永远不为空).

Why second fails to compile?

捕获任何东西的Lambdas没有转换为函数指针(该状态如何通过?)

如果你必须使用lambda:

叫它:

return [](int n1,int n2) { return n1 > n2; }(n1,n2); //notice the () to call it

或者,你的第二种方式,这更有意义,但不如只是返回n1> N2:

return [=] { return n1 > n2; }(); //= captures everything used by value                                  //-> bool and parameter List are redundant

最后,值得注意的是,< functional>中的std :: greater已经这样做了:

std::sort(…,std::greater<int>()); //std::greater<> in C++14
总结

以上是内存溢出为你收集整理的C 11 lambda表达式捕获与参数传递全部内容,希望文章能够帮你解决C 11 lambda表达式 – 捕获与参数传递所遇到的程序开发问题。

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

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

原文地址: http://outofmemory.cn/langs/1234145.html

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

发表评论

登录后才能评论

评论列表(0条)

保存