
lambda
表达式
|
205
•
闭包类就是实例化闭包的类。每个
lambda
式都会触发编译器生成一个独一无二
的闭包类。而闭包中的语句会变成它的闭包类成员函数的可执行指令。
lambda
式常用于创建闭包并仅将其用作传递给函数的实参。上述对
std::find_if
的调
用就符合这个情形。不过,一般而言,闭包可以复制。所以,对应于单独一个
lambda
式的闭包型别可以有多个闭包。例如,在下面的代码中:
{
int x;
// x
是个局部变量
…
auto c1 =
// c1
是
lambda
产生的闭包的副本
[x](int y) { return x * y > 55; };
auto c2 = c1;
// c2
是
c1
的副本
auto c3 = c2;
// c3
是
c2
的副本
…
}
c1
、
c2
和
c3
都是同
一
lambda
式产生的闭包的副本。
在非正式场合,
lambda
式、闭包和闭包类之间的界线大可以模糊一些。但在本章接下
去的条款中搞清楚上面这几个概念哪些存在于编译期(
lambda
式和闭包类),哪些存
在于运行期(闭包),以及它们彼此之间有何联系,则常常是重要的。
条款
31
:避免默认捕获模式
C++11
中有两种默认捕获模式:按引用或按值。按引用的默认捕获模式可能导致空悬
引用,按值的默认捕获模式会忽悠你,好像可以对空悬引用免疫(其实并没有),你,
让你认为你的闭包是独立的(事实上它们可能不是独立的)。
这些就是本条款的纲领性内容了。但如果你本性上更偏向于工程师而不是领导,你就
会不仅要一个骨架,还得有血有肉。所以我们就从默认捕获模式的危害说起吧。 ...