c++Lambda匿名函数

所谓匿名函数,简单地理解就是没有名称的函数,又常被称为lambda函数或者lambda表达式。

(1) 定义

lambda匿名函数很简单,可以套用如下的语法格式:

[外部变量访问方式说明符](参数)mutablenoexcept/throw()->返回值类型
{
函数体;
};

其中各部分的含义分别为:

a. [外部变量方位方式说明符]

[]方括号用于向编译器表明当前是一个lambda表达式,其不能被省略。在方括号内部,可以注明当前lambda函数的函数体中可以使用哪些“外部变量”。
所谓外部变量,指的是和当前lambda表达式位于同一作用域内的所有局部变量。

b. (参数)

和普通函数的定义一样,lambda匿名函数也可以接收外部传递的多个参数。和普通函数不同的是,如果不需要传递参数,可以连同()小括号一起省略;

c. mutable

“此关键字可以省略”,如果使用则之前的()小括号将不能省略(参数个数可以为0)。默认情况下,对于以值传递方式引入的外部变量,不允许在lambda表达式内部修改它们的值(可以理解为这部分变量都是const常量)。而如果想修改它们,就必须使用mutable关键字。
注意:对于以值传递方式引入的外部变量,lambda表达式修改的是拷贝的那一份,并不会修改真正的外部变量;

d.noexcept/throw()

“可以省略”,如果使用,在之前的()小括号将不能省略(参数个数可以为0)。默认情况下,lambda函数的函数体中可以抛出任何类型的异常。而标注noexcept关键字,则表示函数体内不会抛出任何异常;使用throw()可以指定lambda函数内部可以抛出的异常类型。

e.->返回值类型

指明lambda匿名函数的返回值类型。值得一提的是,如果lambda函数体内只有一个return语句,或者该函数返回void,则编译器可以自行推断出返回值类型,此情况下可以直接省略"->返回值类型"。

f.函数体

和普通函数一样,lambda匿名函数包含的内部代码都放置在函数体中。该函数体内除了可以使用指定传递进来的参数之外,还可以使用指定的外部变量以及全局范围内的所有全局变量。
在这里插入图片描述

(2)C++11中的拉姆达表达式中的()可以省略吗

在C++11中,Lambda表达式中的参数列表可以省略括号,但仅限于没有任何参数或使用默认参数的情况。
例如:

// 使用括号
auto f1 = [](int x, int y) -> int { return x + y; };

// 省略括号
auto f2 = []{ return "Hello World"; };
auto f3 = [=]{ std::cout << x << std::endl; };
auto f4 = [x = 42] { std::cout << x << std::endl; };

这里f1不能省略参数列表的括号,因为它接受两个参数。而f2、f3、f4都可以省略参数列表的括号。f2没有参数,f3使用了默认的捕获机制(即以值方式捕获所有外部变量),f4使用了初始化捕获(即使用等号和初始化表达式进行显式捕获)。

需要注意的是,如果省略了参数列表的括号,则无法对参数进行声明和类型定义。如上例中的f2、f3、f4函数对象,其中的参数都是隐式推导的。所以如果需要显式声明参数的类型,还是需要加上参数列表的括号。

(3)C++14中引入的泛型Lambda表达式语法

在C++14中,Lambda表达式可以使用auto关键字来声明参数类型,例如:

auto add = [](auto x, auto y){return x+y;}

这样定义的Lambda表达式可以接受任意类型的参数,并返回对应类型的结果。这种语法特性可以方便地实现泛型算法和函数对象,增强了C++的通用编程能力。

需要注意的是,C++11中的Lambda表达式也可以使用参数自动类型推导(即省略参数类型),但是需要使用decltype关键字来推导参数类型,例如:

auto add = [](decltype(0) x, decltype(0) y){return x+y;};

这种语法相对比较麻烦,C++14中引入的auto参数类型推导语法更加简洁易用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

踏过山河,踏过海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值