C++lambda宝典
admin
2024-01-21 10:31:30
0

为什么叫lambda宝典?先看

第一题

auto* p = +[] {return 6; };

这里的+是什么作用?

  1. 这是一个非捕获的lambda,自然可以生成对应转换函数转换为函数指针,这里的一元+是为了辅助推导,是为了创造合适的语境。自然理解为使用转换函数返回函数指针,+指针 符合规范
  2. 这里auto**可不可以去掉?可以,没啥作用

第二题

int main() {static int a = 42;auto p =[=] { ++a; } ;std::cout << sizeof p << '\n';p();return a;
}

提问,打印p是多少?return a是多少?

答案: 1 43

解释

  1. 如果变量满足下列条件,那么 lambda 表达式在使用它前不需要先捕获:该变量是非局部变量,或具有静态或线程局部存储期(此时无法捕获该变量),或者该变量是以常量表达式初始化的引用。

  2. 这里的捕获是[=],但是其实写不写都无所谓,反正这个作用域就一个静态局部变量a,你也无法捕获到这个变量。那么按照空类,p的大小一般来说自然也就是1了。

第三题

//1.
int main() {const int a = 6;[] {std::cout << a << '\n';}();
}//通过编译//2.
int main() {constexpr int a = 6;[] {std::cout << a << '\n';}();
}//通过编译//3.
int main() {const float a = 6;[] {std::cout << a << '\n';}();
}//error//4.
int main() {constexpr float a = 6;[] {std::cout << a << '\n';}();
}//通过编译//5.
int main() {const int a = 6;[] {std::cout << &a << '\n';}();
}//error
  1. 如果变量满足下列条件,那么 lambda 表达式在读取它的值前不需要先捕获:

    • 该变量具有 const 而非 volatile 的整型或枚举类型,并已经用常量表达式初始化,或者
    • 该变量是 constexpr 的且没有 mutable 成员。
  2. 同上

  3. 同上

  4. 同上

  5. 这个比较特殊,是ODR的一个事情

    ODR 使用

    非正式地说: 1. 一个对象在它的值被读取(除非它是编译时常量)或写入,或它的地址被取,或者被引用绑定时,这个对象被 ODR 使用。 2. 使用“所引用的对象在编译期未知”的引用时,这个引用被 ODR 使用。 3. 一个函数在被调用或它的地址被取时,被 ODR 使用。 如果一个对象、引用或函数被 ODR 使用,那么程序中必须有它的定义;否则通常会有链接时错误。

    链接是:https://zh.cppreference.com/w/cpp/language/definition

但是说实话其实你也可以不考虑ODR,只需要看1的规则,是说lambda表达式再读取它的值前不需要先捕获,可没说读地址。当然本质的原因肯定是ODR,只是这个概念也比较生涩。

小总结

记住下面两条概念就好

  1. 如果变量满足下列条件,那么 lambda 表达式在使用它前不需要先捕获:
  • 该变量是非局部变量,或具有静态或线程局部存储期(此时无法捕获该变量),或者
  • 该变量是以常量表达式初始化的引用。
  1. 如果变量满足下列条件,那么 lambda 表达式在读取它的值前不需要先捕获:
  • 该变量具有 const 而非 volatile 的整型或枚举类型,并已经用常量表达式初始化,或者
  • 该变量是 constexpr 的且没有 mutable 成员。

继承lambda

你不会以为我要像下面这样,讲这么简单的吧??

struct X :decltype([] {std::cout << "66\n"; }){};

这完全没什么好说的,我们需要套个娃

template
struct overloaded : Ts...
{using Ts::operator()...;
};
//使用方式:
int main() {auto c = overloaded{ [](int arg) { std::cout << arg << ' '; },[](double arg) { std::cout << arg << ' '; },[](auto arg) { std::cout << arg << ' '; }};c(10);c(15.1);c("傻子傻子");
}

只有五行代码而已,提示:要求C++20,如果是C++17需要加上推导指引,using 声明使用形参包是C++17添加

template overloaded(Ts...)->overloaded;//CTAD 用户定义推导指引 C++17

lambda捕获子句包展开

template
void f(Args... args){auto lm = [&args...] { return g(args...); };lm();
}
int main() {f(1, 1.0, 1.f);
}

new一个带捕获lambda

#include
int main() {auto lambda = [x = 0](int c) {std::cout << c << std::endl; };auto pLambda = std::make_shared(lambda);(*pLambda)(10);auto p = new auto([x = 0](int c) {std::cout << c << std::endl; });(*p)(10);delete p;
}

返回的指针是指向了lambda类的对象,自然要先*然后调用operator(),如果你对new auto()这个组合有疑问

  • 类型new类型 中使用了占位符,即 auto 或 decltype(auto) (C++14 起),可能与类型约束结合 (C++20 起)
auto p = new auto(5.6);

lambda表达式是什么?

lambda 表达式是纯右值表达式,它的类型是独有的无名非联合非聚合类类型,被称为闭包类型(closure type),它(对于 实参依赖查找 而言)在含有该 lambda 表达式的最小块作用域、类作用域或命名空间作用域声明。

lambda与constexpr

	constexpr int a = [] {return 6; }();//合法 要求C++17

可以显式指定函数调用运算符或运算符模板的任意特化为 constexpr 函数。如果没有此说明符但函数调用运算符或任意给定的运算符模板特化恰好满足针对 constexpr 函数的所有要求,那么它也会是 constexpr

总结

lambda的模板形参,泛型lambda也没什么好介绍的了,没啥坑,先这样

相关内容

热门资讯

一秒推:提升AI相关性所需的G... 在提升AI相关性的过程中,内容概要发挥着重要作用。通过明确内容的主题和重点,企业能够确保信息与消费者...
有色金属、旅游板块,多股涨停! 今日早盘,A股低开震荡调整,上证指数下试4100点支撑,科创50开盘跌破1500点,深证成指、北证5...
一张券,在武汉换了套三室两厅! 武汉旧城改造“出新招”了 一张“购房券” 让居民告别“老破小” 自主选新房 居民一家在新房合影留念...
白癜风医生郑华国:白癜风患者的... 冬季气候寒冷、干燥,对白癜风患者的皮肤和机体状态都有一定影响,护理的核心是“保暖防寒、保湿修复”。冬...
长宁国资入主淳厚基金 股东内斗... 1月10日,淳厚基金发布公告称,根据股东会决议,并经中国证券监督管理委员会《关于核准淳厚基金管理有限...
151家上市公司抢先披露202... 截至目前,A股上市公司陆续发布2025年年报业绩预告。 iFinD数据显示,截至1月14日,A股共有...
机构席位卖出5336.95万 ... 每经讯,2026年1月15日,北交所上市公司星图测控(920116,收盘价:115.4元)登上龙虎榜...
三晖电气大宗交易折价成交126... 三晖电气01月15日大宗交易平台共发生1笔成交,合计成交量126.00万股,成交金额2548.98万...
小米SU7将改款,雷军:保值率... 1月15日,小米创办人、董事长兼CEO雷军回应小米SU7保值率一事。 雷军转载2025年第四季度1...
2025中国产业带发展趋势报告 今天分享的是:2025中国产业带发展趋势报告 报告共计:18页 2025中国产业带发展趋势总结 20...
央行回应降准降息:今年还有降准... 南都讯记者潘珊菊 发自北京 关于今年降准降息空间还有多大?中国人民银行新闻发言人、副行长邹澜1月15...
智谱和MiniMax上市表现亮... 文 | 梅花鹿观察 佘宗明 如果要为中国大模型行业2026年开年来拿到的剧本起名字,那最合适的四个...
监管批复!汪强就任嘉善联合村镇... 2026年1月15日,根据国家金融监督管理总局消息,《浙江嘉善联合村镇银行股份有限公司关于汪强行长任...
原创 2... 2000枚以太币换别墅!证监会前司长栽了,虚拟货币不是避风港?普通人必看避坑指南 2026年1月14...
整体降费300亿元!公募基金销... 文丨杨练 编辑丨李恒春 本次公募基金销售端改革预示三阶段费改正式落地,有望降低投资者成本,旨在引导投...
钱大妈提交上市申请;安踏或收购... -上市动态- 钱大妈提交上市申请 港交所官网披露了钱大妈国际控股有限公司在港交所提交的上市申请...
央行:贷款利率、首付比例下调 今日快讯 刚刚,国新办召开新闻发布会,推出关于企业贷款利率、商业用房贷款首付比例下调等金融政策: 具...
消费观察|袁记云饺赴港递表:中... 深圳新闻网2026年1月15日讯(记者 常军平)在竞争激烈的中式快餐赛道,一颗从广东街头起家的“云饺...
四点半观市 | 机构:逆周期调... 深成指、创业板指尾盘翻红,半导体产业链震荡走强;供应扰动推动投机资金涌入推升锡价,警惕资金获利了结引...