C++ lamba使用
Moderm Effective C++ 条款31 第206提到了按引用捕获局部变量和函数形参时,如果lambda式的生命期依赖于局部变量和函数形参的生命期,需注意空悬引用的问题。
原书的例子不够直观,把它改写后进行说明。
#include "pch.h"
#include <iostream>
#include <vector>
#include <functional> using FilterContainer = std::vector<std::function<bool(int)>>;
FilterContainer filter; void addDivisorFilter() { auto divisor = ;
filter.emplace_back([&](int value) {
return value % divisor == ;
});
std::cout << divisor << std::endl;
} int main()
{
addDivisorFilter();
addDivisorFilter();
std::cout << &filter[] << std::endl;
std::cout << filter[]() < <std::endl; //Unexpected function calls
std::cout << &filter[] << std::endl;
std::cout << filter[]() << std::endl; //Unexpected function calls
}
filter是一个筛选器函数(筛选5的倍数)集合,line23,预期输出0,因为4不是5的倍数。line23,预期输出1.
实际结果则是

箭头1指向的结果看起来正确,箭头2指向的结果不正确,但这两个结果其实都是未定义行为的结果,不符合预期。
跟踪代码如下:

红框部分显示divisor是个很大的负数,不是预期的数字5。所以两次lambda调用结果输出都是0。
问题就出在lambda引用了divisor这个局部变量,addDivisorFilter函数出了代码块后,divisor消亡,lambda指向了一个空悬的divisor引用,当调用lambda时,它里面的divisor是一个未知值。
用这个未知值来进行模计算,当然会出错了。
未完待续...
C++ lamba使用的更多相关文章
- 【lamba】java 8的新特性
看到lamba表达式用起来还不错,找了几篇文章学习下: 所以结合之前两个反编译的结果可以看到,lamdba表达式运行整体思路大致如下: 1. lamdba表达式被编译生成当前类的一个私有静态方法 2. ...
- lamba匿名函数与内置函数/递归
max 循环出的参数给func,func的返回值给key,然后比较那个返回值max(salary,key=func) 匿名函数:max(salary,key=lamba x:salaries[x]) ...
- lamba数据架构以及数据湖
面试大数据项目,面试过程中发现面试官提到的两个概念没有搞清楚: 1. lamba数据架构:这个概念的提出是由storm的作者提出来的,其实主旨就是想要说明,数据的处理分成三层,一类是批处理程序(bat ...
- Java8中list.sort的lamba表达式
最近写代码,需要对list集合排序,IDEA总是黄色警告: Reports calls to Collections.sort(list, comparator) which could be rep ...
- python高阶函数(Map、Reduce、Filter、lamba)
Map函数 map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回. 代码如下: >>> def f(x): . ...
- 【c++】c++ 11之lamba表达式
C++ lambda表达式与函数对象 lambda表达式是C++11中引入的一项新技术,利用lambda表达式可以编写内嵌的匿名函数,用以替换独立函数或者函数对象,并且使代码更可读.但是从本质上来讲, ...
- [C/C++11语法]_[0基础]_[lamba 表达式介绍]
场景 lambda 表达式在非常多语言里都有一席之地,由于它的原因,能够在函数里高速定义一个便携的函数,或者在函数參数里直接高速构造和传递. 它能够说是匿名函数对象,一般仅仅适用于某个函数内,仅仅做暂 ...
- linq 和lamba表达式
一.什么是Linq(what)二.Linq的优点(why)三.Linq查询的步骤(how)四.查询基本操作五.結合實例代碼(具體聯繫用linqtosql來寫的增刪改查)一.什么是Linq(what). ...
- python lamba表达式
lambda函数也叫匿名函数,即,函数没有具体的名称. g=lambda x:x**2 def f(x): return x**2 lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边是 ...
随机推荐
- 06python上
product_list=[ ('Mac',9000), ('kindle',800), ('tesla',900000), ('python book',105), ('bike',2000), ] ...
- 非virtual函数,用指针进行upcast
void print_func(A* p) { p -> print(); } int main() { A a(); B b(,); //a.print(); //b.print(); pri ...
- vue.js+SSH添加和查询
Vue.js 是一套构建用户界面的渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,它不仅易于上手,还便于与第三方库或既有项目整合.另一方面,当与 ...
- 思维导图-mysql log
- Python单元测试unittest【转自https://www.cnblogs.com/feng0815/p/8045850.html】
[转自https://www.cnblogs.com/feng0815/p/8045850.html] Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一 ...
- echarts Cannot read property 'getAttribute' of null 问题的解决方法
今天在使用echarts练习官方给的实例的时候,代码没有问题 却总是报错“Cannot read property 'getAttribute' of null” 找了好久的文档没有看明白 ... 最 ...
- cadence 17.2 安装破解
安装包都在gaobo百度云/工具/开发工具 或者 下载链接 进去pcb edit 可能会提示 licese什么的,忽略就可以了.
- 【VBA】セールの値は配列に変換方法
方法一 Sub test1() //変数の定義 Dim a() As Integer, iRow As Long, i As Integer //非空白のセールまでの行を取得 iRow = Cells ...
- Yii 框架不同逻辑处理方法统一事务处理
1.定义事务处理接口 <?php namespace frontend\business\SaveRecordByransactions; /** * Interface ISaveForTra ...
- load 过高分析办法
1.top -H 找到占用cpu较高的进程2.top -Hp pid 找到该进程下占用cpu较高的线程id3.sudo -u adminjstack -F 进程id > ~/stack.txt ...