cpp的lambda表达式
  BYaHC1OPAeY4 12天前 31 0
C++

在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结果。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 12天前 0

暂无评论

推荐阅读
  8Tw5Riv1mGFK   19天前   30   0   0 C++
  BYaHC1OPAeY4   12天前   31   0   0 C++
  yZdUbUDB8h5t   15天前   22   0   0 C++
  oXKBKZoQY2lx   3天前   10   0   0 C++
BYaHC1OPAeY4
作者其他文章 更多