IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++详解 : Lambda函数表达式 -> 正文阅读

[C++知识库]C++详解 : Lambda函数表达式


§ · 前言

在阅读本文前,您需要知道基本的函数定义方式如:

void outp(const char* s){std::cout<<s;}

文中的一些标识符:

  • ret-type : 该函数的返回值。
  • func-name : 函数名称。
  • para : 参数(列表)。
  • statement : 函数主体。
  • capture : 捕捉列表。

一、基本

我们知道,一般的函数定义方式:

ret-type func-name(para) {statement}

二、描述

C++11支持匿名函数,称 Lambda函数(也即Lambda表达式),它可以将函数看作对象,像对象一样被使用 (不是那个意思啊喂(#`O′)),也可以像一般函数一样传入参数、求值。

三、语法

Lambda的定义本质上与一般函数很像,如下:

//注:【***】表示可省略。
[capture](para)mutable】【->ret-type】{statement}

其中,

  • para即参数列表,为空时可省略(仅当没有mutable修饰符时)。
  • mutable,默认情况下,Lambda总是const函数,使用该修饰符以取消常量性,此时参数列表不可省略(即使为空)
  • ->ret-type,返回类型,为void时可连同->一起省略,返回类型明确时也可以省略,让编译器推导,一般建议写一下防止出错。
  • capture,捕捉列表,Lambda仅能访问当前(Lambda内部)定义域及参数列表传入的参数(成为闭包–Closure–行为),若要传入外部变量,需要在[ ]中声明,有以下形式:
    [ ]			//什么外部变量也不引入。
    [=]			//隐式地将所有外部变量以 *传值* 的形式传入,即函数内无法修改函数外的值
    [&]			//隐式地将所有外部变量以 *引用* 的形式传入,即函数内可以对外部值修改。
    [x]			//显式地将变量x以 *传值* 的方式传入。
    [&x]		//显式的将变量x以 *引用* 的方式传入。
    [this]		//捕获对象,以 *引用(其实是复制指针)* 传入。
    [*this]		//捕获对象,以 *传值* 传入。
    
    //还可以配合起来
    [x,&y]		//x传值,y引用
    [&,x]		//x传值,其余引用
    [&x,=]		//x引用,其余传值
    
    实际上,[ ]也是Lambda表达式开始的标识。
    需注意,对于[=][&],Lambda可以使用this,但对于空捕捉([ ],或仅引用一些变量的[x,&y,z,w]),需要显式的捕捉[this]以使用它:
    ...
    class ex{
    public:
    	ex(){}
    private:
    	void outp(){cout<<"hello world";}
    public:
    	function<void()> func=[this]{this->outp();};
    }test;
    test.func();
    
  • statement : 函数主体。

实际上,最简单的Lambda可以是:

[]{}

屁用没有

四、调用

Lambda函数是匿名的,声明时没有名称,不能独立成句,可以这么写:

auto outp=[]{cout<<"hi";}
outp();

当将一个变量赋值为Lambda时,就可以当做函数使用了,要记得加(),参数放里面。
也可以使用模板std::function<>(function<>模板):

using namespace std;
function<void()> outp=[]{cout<<"hi";}

请注意,对于递归函数,请不要使用Lambda声明,否则可能发生意想不到的错误(就跟inline一样)





@HaohaoCppDebuger|寻兰?
2021/11/19?

-----THE END-----
THANK YOU !

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-20 18:12:41  更:2021-11-20 18:13:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:20:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码