博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
lambda表达式初探
阅读量:2194 次
发布时间:2019-05-02

本文共 2036 字,大约阅读时间需要 6 分钟。

lambda表达式定义

[捕获列表]    (参数列表)         返回类型    {函数体}
[capture list](parameter list)->return type {function body}
其中,捕获列表是一个lambda所在函数中定义的局部变量的列表(通常为空);return type,parameter list和function body与任何普通函数一样,
分别表示返回类型,参数列表和函数体。但是,与普通函数不同,lambda必须使用尾置返回来指定返回类型。

    《Primer C++》(第5版)6.3.3节 使用尾置返回类型

    //func接受一个int类型的实参,返回一个指针,该指针指向含有10个整数的数组
    auto func(int i)->int(*)[10];

我们可以忽略参数列表和返回类型,但必须永远包含捕获列表和函数体

auto f = [] {return 52}
定义一个可调用对象f,它不接受参数,返回52
cout << f() << endl;//打印52
在lambda中忽略括号和参数列表等价于指定一个空参数列表。在此例中,当调用f时,参数列表是空的。
如果忽略返回类型,lambda根据函数体中的代码推断出返回类型。如果函数体只是一个return语句,
则返回从返回的表达式的类型推断而来,否则,返回类型为void.

捕获列表可以有多个捕获选项,以逗号分隔,规则如下:

[ ]        :无捕获,函数体内不能访问任何外部变量
[ =]       :以值(拷贝)的方式捕获所有外部变量,函数体内可以访问,但是不能修改。
[ &]       :以引用的方式捕获所有外部变量,函数体内可以访问并修改(需要当心无效的引用);
[ var]     :以值(拷贝)的方式捕获某个外部变量,函数体可以访问但不能修改。
[ &var]    :以引用的方式获取某个外部变量,函数体可以访问并修改
[ this]    :捕获this指针,可以访问类的成员变量和函数,
[ =,&var] :引用捕获变量var,其他外部变量使用值捕获。
[ &,var]  :只捕获变量var,其他外部变量使用引用捕获。

示例:

#include 
using namespace std;int main(){ int x = 5; int y = 9; auto f = []{return 52;};//花括号后面一定要加分号 auto f1 = [=](){return x;};//以值方式捕获所有变量,不能修改 auto f2 = [&](){return ++x;};//以引用方式捕获所有变量,可以修改,但要当心引用无效 auto f3 = [x](){return x;};//以值 方式捕获x,不能修改值 auto f4 = [x, &y](){y += x; return y;};//以值 方式捕获x,以引用方式捕获y,y可以修改 auto f5 = [&, y](){x += y; return x;};//以引用方式捕获y之外的所有变量,y不能修改 auto f6 = [&](){y += ++x; return y;};//以引用方式捕获所有变量,可以修改 //auto f7 = [](){return x;};//无捕获,不能使用外部变量,编译错误 //示例1: cout << "x = " << x << " y = " << y << endl; cout << f() << endl; cout << "x = " << x << " y = " << y << endl; cout << f1() << endl; cout << "x = " << x << " y = " << y << endl; cout << f2() << endl; cout << "x = " << x << " y = " << y << endl; cout << f3() << endl; cout << "x = " << x << " y = " << y << endl; cout << f4() << endl; cout << "x = " << x << " y = " << y << endl; cout << f5() << endl; cout << "x = " << x << " y = " << y << endl; cout << f6() << endl; cout << "x = " << x << " y = " << y << endl; cout << "Hello World!" << endl; return 0;}

 

 

转载地址:http://fkiub.baihongyu.com/

你可能感兴趣的文章
(PAT 1061) Dating (字符串处理)
查看>>
(PAT 1118) Birds in Forest (并查集)
查看>>
数据结构 拓扑排序
查看>>
(PAT 1040) Longest Symmetric String (DP-最长回文子串)
查看>>
(PAT 1145) Hashing - Average Search Time (哈希表冲突处理)
查看>>
(1129) Recommendation System 排序
查看>>
PAT1090 Highest Price in Supply Chain 树DFS
查看>>
(PAT 1096) Consecutive Factors (质因子分解)
查看>>
(PAT 1019) General Palindromic Number (进制转换)
查看>>
(PAT 1073) Scientific Notation (字符串模拟题)
查看>>
(PAT 1080) Graduate Admission (排序)
查看>>
Play on Words UVA - 10129 (欧拉路径)
查看>>
mininet+floodlight搭建sdn环境并创建简答topo
查看>>
【linux】nohup和&的作用
查看>>
Set、WeakSet、Map以及WeakMap结构基本知识点
查看>>
【NLP学习笔记】(一)Gensim基本使用方法
查看>>
【NLP学习笔记】(二)gensim使用之Topics and Transformations
查看>>
【深度学习】LSTM的架构及公式
查看>>
【python】re模块常用方法
查看>>
剑指offer 19.二叉树的镜像
查看>>