lambda表达式

C++ Lambda

lambda表达式, 是C++表达式的一种.
闭包是lambda表达式创建的运行期对象, 根据捕获类型的不同, 闭包会持有数据的拷贝或引用.
闭包类就是实例化闭包的类, lambda会促使编译器生成一个独一无二的闭包类, 闭包中的语句会变成它的闭包类成员函数的可执行指令.

避免使用默认捕获模式

lambda存在两种默认捕获模式: 按引用或按值, 按引用的默认捕获模式可能导致空悬的引用, 按值的默认捕获模式会误导以为不会存在空悬引用(实际上还是会).

lambda表达式的生存依赖于所捕获对象的生命期, 若捕获对象过早的被销毁, lambda表达式将发生未定义行为!

1
2
3
4
5
6
7
std::function<int()> test_lambda() {
int tmpobj = 10;

return [&]() {
return tmpobj;
};
}

显示的列出lambda表达式所依赖的局部变量或形参往往是更好的编程实践.

lambda表达式只能捕获在其创建域内可见的非静态局部对象, 而像类成员对象这样的根本无法被捕获, 好在这样的捕获不会通过编译![实验证明能够通过编译.]

按值的默认捕获模式会误导以为闭包是自洽的.
lambda可能依赖静态存储区的对象, 如全局对象, 名字空间内的对象, 类或函数中的static对象, 这些对象可以在lambda中使用, 但无法被捕获. 实际上这些对象有点像按引用捕获.

初始化捕获(C++14)