C++的lambda使用实例分析
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇"C++的lambda使用实例分析"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"
千家信息网最后更新 2026年11月03日C++的lambda使用实例分析
这篇"C++的lambda使用实例分析"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"C++的lambda使用实例分析"文章吧。
先说结论:
对于有捕获的
lambda,其等价于对象。对于没有任何捕获的
lambda,其等价于函数!
首先,很多C++程序员从lambda 用法上反推容易发现是对象,因为lambda可以捕获!这是函数做不到的。的确,比如:
int n = 100;auto foo = [n](int a) { return a > n;};cout<< foo(99);如果编译器要实现foo,大致类比这种写法(可能真实的实现细节不是这样,但思路类似)∶
struct Foo { Foo(int i) {n=i;} bool operator()(int a) { return a > n; }private: int n;};...int n = 100;Foo foo(n);cout<< foo(99);如果是引用捕获了变量,那么struct内有一个指针成员持有被引用捕获的变量的地址。
比如:
setns = {100, 200, 300};auto foo = [&ns](int a) { return ns.find(a);};cout<< foo(99);
大致等价于:
struct Foo { Foo(set* p) {p_ns = p;} bool operator()(int a) { auto &ns = *p-ns; return ns.find(a); }private: set* p_ns;};...set ns = {100, 200, 300};Foo foo(&ns);cout<< foo(99); 然而……这并不是全部!
在没有捕获任何东西的时候,lambda其实是等价于普通的函数的!可以用Linux C中函数pthread_create()来验证!它只能接收一个参数是void*,返回值也是void*的回调函数。
神奇的是,无参的lambda也可以被pthread_create()使用!
using namespace std;struct A { void* operator()(void*) { cout<<"xxxx"<void* { cout<<"xxxx"<上面代码还可以再改一下,让cb去捕获一个变量, 比如:
auto cb = [&](void*)->void* { cout<<"xxxx"<这时,给pthread_create()传入cb同样会编译失败!错误信息:
cb.cpp: In function 'int main()':cb.cpp:23:30: error: cannot convert 'main()::' to 'void* (*)(void*)' 23 | pthread_create(&t, NULL, cb, NULL); | ^~ | | | main()::In file included from /usr/include/x86_64-linux-gnu/c++/9/bits/gthr-default.h:35, from /usr/include/x86_64-linux-gnu/c++/9/bits/gthr.h:148, from /usr/include/c++/9/ext/atomicity.h:35, from /usr/include/c++/9/bits/ios_base.h:39, from /usr/include/c++/9/ios:42, from /usr/include/c++/9/ostream:38, from /usr/include/c++/9/iostream:39, from cb.cpp:1:/usr/include/pthread.h:200:15: note: initializing argument 3 of 'int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)' 200 | void *(*__start_routine) (void *), | ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
这其实也不难理解,C++在lambda的设计上也贯彻着零开销 (Zero Overhead)原则,也就是C++不在性能上干多余的事,显然函数比对象开销更小。所以即使同为lambda,在有无捕获的时候,其底层实现其实是截然不同的!
以上就是关于"C++的lambda使用实例分析"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。
C++
函数
内容
等价
实例
实例分析
分析
变量
对象
编译
开销
文章
时候
知识
篇文章
不同
普通
神奇
截然不同
东西
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
保险科技 互联网保险
互联网科技官网
科技创新与互联网经济
互联网科技深圳
上海互联网科技有限公司
中国互联网科技发展
腾讯科技 互联网女皇
互联网科技股午盘股票涨跌
江苏南京365互联网科技
互联网企业和科技型企业
科技互联网大厂
互联网科技商业
链环科技传统企业怎么转型互联网
互联网金融科技展
长沙茂晟互联网科技有限公司
互联网科技如何创业
互联网第三次科技革命特征
上海创道互联网络科技有限公司
新氧科技和美国互联网有关系吗
科技互联网企业在行动
咖啡豆
手磨咖啡
上海挚品互联网科技有限公司
什么是科技互联网
中国互联网科技发展
鑫亿盛互联网科技
中盈科技互联网信息有限公司
佛山市翊博互联网络科技有限公司
深圳艾果互联网通讯科技
新氧科技和美国互联网有关系吗