lambda表达式之QA

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中使用它。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值