前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >这是一个函数[](){}

这是一个函数[](){}

作者头像
Qt君
发布2019-07-15 15:32:40
9660
发布2019-07-15 15:32:40
举报

[](){}是一个C++11下的Lambda表达式(匿名函数),当然[]{}也是一个Lambda表达式。

1. Lambda表达式区别

Lambda表达式可以像对象一样使用,比如可以将它们赋给变量和作为参数传递,还可以像函数一样具有返回值。Lambda表达式本质上与函数声明非常类似。lambda可以转换为std::function函数,但是它又与类型有所区别。使用typeid获取类型名字即使是相同的表达式,它们的名字也会不一样。

typeid([](){}).name();
typeid([](){}).name();

2. Lambda表达式写法

(1) Capture子句,在 C++ 规范中也称为 lambda 引导;

[]不捕获任何变量;
[&]捕获外部作用域中所有变量,并作为引用在函数体中使用(按引用捕获);
[=]捕获外部作用域中所有变量,并作为副本在函数体中使用(按值捕获)。

(2) 参数列表(可选),也称为 lambda 声明符;

(3) 可变规范(可选);

(4) 异常规范(可选),可以填mutable, exception, attribute;

mutable:   说明lambda表达式体内的代码可以修改被捕获的变量,并且可以访问被捕获的对象的non-const方法;
exception: 说明lambda表达式是否抛出异常以及何种异常;
attribute: 用来声明属性。

(5) 尾随返回类型(可选);

(6) "Lambda 体"。

3. Lambda表达式的使用示例

(1) 通过std::function转换使用;

std::function<int(int)> square = [](int i) -> int { return i * i; };
square(1);

(2) 通过auto转换使用:

auto square = [](int i) -> int { return i * i; };
square(1);

(3) 直接使用:

[](int i) -> int { return i * i; }(1);

4. 使用Lambda表达式的简洁之道

(1) 使用lambda表达式实现自定义排序;

std::array<int, 10> s = {5, 7, 4, 2, 8, 6, 1, 9, 0, 3}; 
std::sort(s.begin(), s.end(), [](int a, int b) {
            return a > b;   
         });

(2) 可以实现简化代码,不再需要重新定义函数体再调用;

最后,由于lambda特性较多,在使用方便的同时实则会增加使用的难度,后续会在开源网络库(历史图文可以看到该库的相关知识)中加入lambda支持。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Qt君 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档