在C++中,lambda表达式提供了一种方便的方式来定义匿名函数。Lambda可以用来创建简单的函数对象,常用于算法库中的函数参数,特别是在STL(Standard Template Library)中。

Lambda表达式的语法是这样的:

[ capture ] ( parameters ) -> return-type {
function-body
}

其中:

  • capture:捕获列表,用于指定哪些变量从封闭的作用域中捕获以及如何捕获(值捕获、引用捕获、不捕获、隐式捕获)。例如,[x, &y]表示x通过值捕获,而y通过引用捕获。
  • parameters:参数列表,与普通函数的参数列表类似。如果没有参数,可以省略或者写成空括号()
  • return-type:返回类型。自C++14起,如果lambda函数体只包含一个return语句,或者返回类型显而易见,则可以省略返回类型,编译器会进行自动推断。
  • function-body:函数体,包含了lambda的执行语句。

下面是一些lambda表达式的示例:

示例 1:无参数,简单的打印

auto printHello = []() {
std::cout << "Hello, World!" << std::endl;
};
printHello(); // 调用lambda表达式

示例 2:使用参数和返回值

auto add = [](int x, int y) -> int {
return x + y;
};
std::cout << add(5, 3) << std::endl; // 输出8

示例 3:值捕获外部变量

int z = 4;
auto addZ = [z](int x) -> int {
return x + z; // z通过值捕获进来
};
std::cout << addZ(3) << std::endl; // 输出7

示例 4:引用捕获外部变量

int w = 4;
auto modifyW = [&w](int x) {
w = x; // w通过引用捕获,可以修改其值
};
modifyW(5);
std::cout << w << std::endl; // 输出5

Lambda表达式是C++11及以后版本中的一个强大特性,它大大简化了代码的编写,尤其是在需要使用临时函数对象的场合。


为什么要使用auto?

因为lambda表达式的实际类型是一个匿名函数类型,不方便直接声明

不使用auto来声明lambda匿名函数

在C++中,每个Lambda表达式都有一个独一无二的、编译器生成的类型。因此,我们通常不能不使用auto直接声明一个Lambda表达式的变量类型,除非我们使用C++11之后的标准模板库中引入的std::function来包装该Lambda表达式。

示例: 使用std::function声明add

#include <functional>

// 使用std::function来声明add变量,避免使用auto。
std::function<int(int, int)> add = [](int a, int b) {
return a + b;
};

在这个示例中,我们使用std::function来指定add变量的类型。std::function<int(int, int)>指明了add是一个函数,它接受两个int参数并返回一个int结果。

cpp的lambda表达式的更多相关文章

  1. C++11新特性(3) lambda表达式(1)

    C++11加入了一项名为lambda表达式的新功能.通过这项功能能编写内嵌的匿名函数,而不必编写独立函数或函数对象,使得代码更加理解. lambda表达式包括下面部分. [capture_block] ...

  2. Cocos2d-x开发实例:使用Lambda 表达式

    在Cocos2d-x 3.0之后提供了对C++11标准[1]的支持,其中的Lambda[2]表达式使用起来非常简洁.我们可以使用Lambda表达式重构上一节的实例. 我们可以将下面的代码: liste ...

  3. Lambda 表达式的示例-来源(MSDN)

    本文演示如何在你的程序中使用 lambda 表达式. 有关 lambda 表达式的概述,请参阅 C++ 中的 Lambda 表达式. 有关 lambda 表达式结构的详细信息,请参阅 Lambda 表 ...

  4. C++11里面的Lambda表达式

    Lambda Expressions in C++ C++中的Lambda表达式 In Visual C++, a lambda expression—referred to as a lambda— ...

  5. C++教程之lambda表达式一

    什么是Lambda? C++ 11增加了一个很重要的特性--Lambda表达式.营里(戴维营)的兄弟都对Objective-C很熟悉,很多人多block情有独钟,将各种回调函数.代理通通都用它来实现. ...

  6. lambda表达式初步

    // Lambda_test20140801.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <algorithm& ...

  7. C++11 lambda表达式是如何实现的?

    lambda表达式是如何实现的呢? 其实是编译器为我们了创建了一个类,这个类重载了(),让我们可以像调用函数一样使用.所以,你写的lambda表达式和真正的实现,是这个样子的: 而对于捕获变量的lam ...

  8. 第13课 lambda表达式

    1. lambda的语法形式:[capture](params) opt -> ret {body;}; (1)capture为捕获列表 ①[].[&]和[=]分别表示不捕获.按引用捕获 ...

  9. Lambda 表达式的示例

    本文中的过程演示如何使用 lambda 表达式. 有关 lambda 表达式的概述,请参见 C++ 中的 Lambda 表达式. 有关 lambda 表达式结构的更多信息,请参见 Lambda 表达式 ...

  10. Lambda 表达式语法

    本主题介绍 lambda 表达式的语法. 它演示提供 lambda 表达式的结构元素的示例,这些元素与示例. Lambda 表达式语法 下面用于定义显示语法,ISO C++11 从标准,lambda ...

随机推荐

  1. Manus,没有秘密「注解版」

    近来Manus走红,「争论」不断,我也在前文<Manus爆火,是硬核还是营销?>中阐述过自Manus发布后,行业讨论以及开源复刻的信息,以及我们如何结合蚂蚁图计算(TuGraph)技术,实 ...

  2. 5个步骤完成 Vue3 开发调试工具安装教程

    Vue3 开发调试工具安装教程 5个步骤 第一步:点击浏览器右上角,更多工具 – 扩展程序 第二步:点击右上角 – 开发者模式 开关 第三步:点击 "添加已解压的扩展程序" 第四步 ...

  3. godoc使用方法介绍

    一.go doc简介 Godoc是go语言的文档化工具,类似于文档化工具godoc,类似于Python的Docstring和Java的Javadoc Godoc通过解析包含注释的Go代码来生成HTML ...

  4. Linux下启动Oracle命令

    1.进入LInux,切换到Oracle用户权限,输入数据库密码.su - oracle    1在这里插入图片描述2.输入sqlplus "/as sysdba"    1在这里插 ...

  5. 性能优化之使用HTTP2.0

    HTTP2.0 的优势 配置 测试 怎么查看当前网站http版本 chrome HTTP协议版本检测 Chrome 控制台 window.chrome.loadTimes() { commitLoad ...

  6. [每日算法 - 华为机试] leetcode172. 阶乘后的零

    入口 力扣https://leetcode.cn/problems/factorial-trailing-zeroes/ 题目描述 给定一个整数 n ,返回 n! 结果中尾随零的数量. 提示 n! = ...

  7. 使用SPA单页面跟MPA多页面的优缺点?

    SPA vs MPA 深度解析 1. 概述 什么是 SPA? SPA(Single Page Application,单页面应用)是一种仅加载一个 HTML 页面,并通过 JavaScript 动态更 ...

  8. 跨网段和局域网的SQL SERVER发布订阅配置图解和常见问题

    非常详细,傻瓜式依葫芦画瓢即可. 特别提示:订阅机器上的防火墙以及发布机器远程登录订阅机的问题 通过非命令行方式配置同步订阅 (1)实验环境说明 (2)实验前准备 (3)订阅设置 (4)测试同步订阅 ...

  9. Sunshine+Moonlight让安卓Pad或IPad变6ms低延迟高质量无线显示器 #串流 #无线副屏

    1.背景 最近看到多个博主在分享局域网或者公网使用Sunshine+Moonlight串流技术,将电脑画面投屏到其他屏幕(电视.安卓和苹果平板等等),宣称是个位数的延迟,并且能用平板打steam游戏( ...

  10. Lua中获取第二天凌晨的剩余时间

    在时间这个问题上,lua提供两大方法来供开发者使用,一个是os.time(),一个是os.date(),这两大方法可以满足日常开发的需求. 那么我们如何准确运用这两大方法呢. 在这一文章中我们先讲os ...