Q lambda表达式的类型?
A lambda的类型在编译时确定。实际上是在创建一个匿名类,如果检查汇编器输出,会看到它有一个这样的名字:lambda_4a776e7774c8d4ec8eddd924a4a3b251
Q lambda表达式的汇编代码?
A无论是否捕获变量,它都是与普通类相同的汇编代码。唯一的例外是,如果捕获变量,构造函数是内联的,因为它不会在其他任何地方被重用。
Q 能把一个lambda表达式赋给另一个么?
A 不能,因为类型不同。考虑编写两个独立的类并将它们相互赋值——这在c++中是无效的。
Q [=] or [&]捕获周围所有的变量么?
A 不会。lambda将捕获函数定义中使用的每个变量,仅此而已。
Q 可以定义默认捕获变量值么?
A 可以, 但是是C++14及以上可以。
Q 关于捕获this有什么特别之处么?
A 没有啥特别之处。this是一个指向当前对象的指针,与任何其他变量一样被显式或隐式捕获。在编写类代码时,可以访问成员变量而无需编写this->。
Q 为什么不能捕获静态引用
A 可以在c++ 14或更高版本中使用。然而,lambda只能捕获自动变量,而静态变量,根据定义,不是自动变量。
当然不需要捕获静态变量,也就是没必要在捕获列表中显示的指明静态变量,因为它们在内存中总是具有相同的地址,只需要直接使用静态变量就可以。
Q 为什么不能捕获类成员变量
A 可以,但只能捕获自动变量。不能显式捕获成员变量,因为它们实际上位于解引用指针的后面。要访问成员变量,您需要显式或隐式地捕获this。
Q 捕获变量时,可以一部分通过值捕获,另一部分通过索引捕获么?
A 可以
Q 怎么从一个lambda表达式返回
A 如果使用c++ 14及以上版本,可以将函数的返回类型设置为auto。这将允许直接使用函子类型。
在c++ 11及以下版本中,不能从函数返回auto,这给lambda类型带来了问题。要避免这种情况,最简单的方法是使用std::function或其他可以很好地包装函数的库将其转换。
在使用std::function时,如果捕获了许多变量,请注意潜在的堆分配,以及通过指针而不是直接调用函数的开销。对于小的或空的捕获列表,由于小对象优化,std::function的内存占用将与实际的函子类型相同。
Q copy lambda时会发生什么?
A 将原样复制状态,就像直接复制类对象一样(假设它没有覆盖复制构造函数)。
Q lambda可以嵌套么?
A 可以
Q 为什么不能改变捕获变量的值?
A
注意,在第3行,operator()声明是const的,它不能改变类上的变量。
如果需要它是非const的,你可以使用mutable关键字,如下所示:
Q lambda表达式返回类型?
A 到目前为止,编写一个lambda,并让编译器找出它将返回的类型。
在不显式指定的情况下,lambdas将使用“自动返回类型推导规则“:本质上与将auto放在变量左侧相同。
Q 可以定义一个精确的返回类型么?
A 可以
使用替代函数语法。下面的例子,返回类型位于函数的右侧而不是左侧。可以在常规函数、类的成员函数和lambda中使用它。