在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. 工作面试必备:SQL 中的各种连接 JOIN 的区别总结!

    前言 尽管大多数开发者在日常工作中经常用到Join操作,如Inner Join.Left Join.Right Join等,但在面对特定查询需求时,选择哪种Join类型以及如何使用On和Where子句 ...

  2. Flink 实战之流式数据去重

    系列文章 Flink 实战之 Real-Time DateHistogram Flink 实战之从 Kafka 到 ES Flink 实战之维表关联 Flink 实战之流式数据去重 流式数据是一种源源 ...

  3. 如何删除Docker Swarm中的Node

    好吧,我又回来了...断了那么久主要是因为懒...现在有空会更新一些docker相关的知识.本文主要是总结下在工作中需要管理Docker Swarm中的Node遇到的问题:如何删除一个Swarm中的N ...

  4. Redis 相关

    高并发多机的时候,虽然有失效时间,但还是会有短时间内缓存和数据库数据不一致(读操作不需要特殊操作),更新操作的时候先删除缓存,再更新数据库先更新数据库,再删除缓存原子性破坏,增加队列重试 先删除缓存, ...

  5. 小白必看的java完整下载攻略!(在Typora中有图片参考)

    Java下载 在浏览器上搜索JDK(2024年最新版是22,本人下载的是21) 点击官网下载,会跳到Oracle官网,需要注册账号才可下载 根据自己的电脑型号选择下载(本人下载的是64的) 正常情况下 ...

  6. ArrayList的常用成员方法

    1.ArrayList常用成员方法 可以大致分为4种,增 删 改 查 1.增 1.public boolean add(E e) 将括号里的元素直接添加到集合中,添加的元素按照顺序依次排列. 其中,E ...

  7. Mono GC

    1.虽然是stw但mark阶段可以concurrent 2.并行mark就需要写屏障 3.unity的gc也不是扫描整个堆内存 https://schani.wordpress.com/2012/12 ...

  8. python,数据拼接举例

    request请求参数data =  '{"TwitterId":123456,"SupperId":0}' data内的123456,实际是个变量,且数据来源 ...

  9. Vitepress 建站资源汇总

    整理下使用 Vitepress 搭建博客过程中使用过的一些资源和方案 主要参考站点 Vitepress 官方文档 VitePress快速上手中文教程,这个站点扩展很全,包括静态部署选择,样式美化,第三 ...

  10. 关于composer报错The openssl extension is required for SSL/TLS protection but is not available问题

    今天使用composer的时候得到了这个错误: The openssl extension is required for SSL/TLS protection but is not availabl ...