[](){}
是一个C++11下的Lambda表达式(匿名函数),当然[]{}
也是一个Lambda表达式。
Lambda表达式区别
Lambda表达式可以像对象一样使用,比如可以将它们赋给变量和作为参数传递,还可以像函数一样具有返回值。Lambda表达式本质上与函数声明非常类似。lambda可以转换为std::function
函数,但是它又与类型有所区别。使用typeid
获取类型名字即使是相同的表达式,它们的名字也会不一样。
typeid([](){}).name();
typeid([](){}).name();
Lambda表达式写法

(1) Capture子句,在 C++ 规范中也称为 lambda 引导;
-
[]
不捕获任何变量; -
[&]
捕获外部作用域中所有变量,并作为引用在函数体中使用(按引用捕获); -
[=]
捕获外部作用域中所有变量,并作为副本在函数体中使用(按值捕获)。
(2) 参数列表(可选),也称为 lambda 声明符;
(3) 可变规范(可选);
(4) 异常规范(可选),可以填mutable, exception, attribute;
-
mutable
: 说明lambda表达式体内的代码可以修改被捕获的变量,并且可以访问被捕获的对象的non-const方法; -
exception
: 说明lambda表达式是否抛出异常以及何种异常; -
attribute
: 用来声明属性。
(5) 尾随返回类型(可选);
(6) "Lambda 体"。
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);
网友评论