首页 > 编程语言 >Effective Modern C++ 第六章 lambda 表达式

Effective Modern C++ 第六章 lambda 表达式

时间:2023-02-05 11:02:03浏览次数:37  
标签:变量 Effective 捕获 Modern C++ 函数 lambda 成员 指针

lambda 能做到的,手写也能做到,但是 lambda 实在是太方便了,以至于对 C++ 开发产生了颠覆性的影响:

常用场景

  • STL _if 算法族的谓词
  • 智能指针的自定义析构器
  • 线程 API 的条件变量(对谓词进行特化处理)
  • 临时制作回调函数、接口适配函数

条款 31:避免默认捕获

  • lambda 捕获只能捕获创建 lambda 作用域内可见的局部、非静态变量(包括形参)
  • 每个非静态成员函数都持有 this 指针,成员函数中访问成员变量都是通过 this 指针
  • 成员函数中,无法捕获成员变量,成员函数中,实际上捕获的是 this 指针!
  • 【最佳实践】新建一个成员变量的副本,然后显式、值捕获该副本
  • 不能捕获静态变量!
  • 使用 lambda 时,要确保引用捕获的对象仍然有效!
  • 按值捕获的 this 指针也要保证使用 lambda 时,指针仍然有效!

无法局部静态变量的测试代码:

vector<function<void(void)>> callables;

void lambdaAddTest() {
  static int si = 0;
  // callables.emplace_back([si] { cout << si; }); // error: 'si' cannot be captured because it does not have automatic storage duration
  callables.emplace_back([=] { cout << si; }); // 警告:此处没有捕获任何变量!
  ++si;
}

int main() {
  lambdaAddTest();
  for (const auto& l : callables) {l();}
  lambdaAddTest();
  for (const auto& l : callables) {l();}
  lambdaAddTest();
  for (const auto& l : callables) {l();}
}

运行结果

122333

标签:变量,Effective,捕获,Modern,C++,函数,lambda,成员,指针
From: https://www.cnblogs.com/tengzijian/p/17093023.html

相关文章

  • 【C++ 泛型编程01:模板】函数模板与类模板
    【模板】除了OOP外,C++另一种编程思想称为泛型编程,主要利用的技术就是模板C++提供两种模板机制:函数模板和类模板函数模板函数模板作用建立一个通用函数,其函数......
  • C++函数总结
    1、fabs返回浮点数的绝对值,abs返回整数绝对值2、运算符重载之后排序比写一个排序函数排序要快structnode{intx,y,z;booloperator<(constnode&p)const{retur......
  • C++基础语法资料
     一、C++基本语法变量名是由字母、数字和下划线字符组成,并且开头不能是数字。大小写不同的变量是不同的。变量名不能是关键字,如for、if等都是不能作为变量名的C++基本......
  • 【八大数据排序法】快速排序法的图形理解和案例实现 | C++
    第十八章快速排序法:::hljs-center目录第十八章快速排序法●前言●认识排序●一、快速排序法是什么?1.简要介绍2.具体情况3.算法分析●二、案例实现1.......
  • C++ Primer 5th 阅读笔记:入门指南
    学习方法Thewaytolearnanewprogramminglanguageistowriteprograms.学习一门新编程语言的方式是编写程序。函数(Function)函数的四部分:返回类型;函数......
  • C/C++保安排班管理系统[2023-02-04]
    C/C++保安排班管理系统[2023-02-04]学校实验楼有7名保安人员:钱、赵、孙、李、周、吴、陈。由于工作需要进行轮休制度,一星期中每人休息一天。预先让每一个人选择自己认为......
  • C/C++交通处罚单管理系统[2023-02-04]
    C/C++交通处罚单管理系统[2023-02-04]题目7.交通处罚单管理系统交通处罚单信息包括:处罚单号码、车牌号、开单交警号码、处罚时间(可以定义日期结构类型,也可以直接以字符......
  • C/C++图书管理系统[2023-02-04]
    C/C++图书管理系统[2023-02-04]设计并实现一个学校图书馆的图书管理系统。具体要求:1、图书信息和借阅信息等保存在文本文件中。2、系统运行时从文件中读取相关信息,保......
  • C++future promise
    Afutureisanobjectthatcanretrieveavaluefromsomeproviderobjectorfunction,properlysynchronizingthisaccessifindifferentthreads.provider比较......
  • C++ atomic的Cacheline及Memory fence问题
    我们都知道多核编程常用锁避免多个线程在修改同一个数据时产生racecondition。当锁成为性能瓶颈时,我们又总想试着绕开它,而不可避免地接触了原子指令。但在实践中,用原子指......