【问题标题】:When to not use lambdas over normal functions?什么时候不使用 lambdas 而不是普通函数?
【发布时间】:2021-10-24 19:23:42
【问题描述】:

我知道 lambda 是如何工作的,我在代码中几乎所有地方都使用 lambda,是否有任何情况下我应该更喜欢使用普通函数而不是 lambda

【问题讨论】:

  • 如果您在代码中“几乎无处不在”使用 lambda,那您就太过分了。当某些代码/功能在非常有限的上下文中使用时,Lambda 往往更可取,而当代码/功能需要在多个上下文中被利用或重用时,函数往往更可取。

标签: c++ function lambda


【解决方案1】:

何时不使用 lambda:

  1. 当函数在标头中声明并在.cpp 文件中实现时。 lambda 无法做到这一点。

  2. 当函数是模板时,您希望能够手动指定模板参数。使用 lambas 执行此操作需要使用丑陋的语法:foo.operator()<...>(...)。

何时使用 lambda:

  1. 当函数被重载/模板化时,您想方便地将其作为参数传递给不同的函数。

  2. 你想避免ADL。


除此之外,更喜欢常规函数而不是 lambda 只是一种约定。

如果你想违背这个约定,你应该准备好解释你的推理。

【讨论】:

    【解决方案2】:

    什么时候不使用 lambdas 而不是普通函数?

    当函数可以在多个上下文中重复使用时,通常最好使用普通函数。

    【讨论】:

    • 我明白了,所以当我不重载它时,它与使用 lambda 和函数几乎相同。当你需要时,通过引用 auto f = [&](){}; 捕获所有内容被认为是一种不好的做法让我们说 1 或 2变量引用。
    • @g0x0 这是主观的。
    • 是的,当只需要捕获一个或两个变量时,通过引用捕获所有内容被认为是不好的做法。带有捕获子句的 Lambas 实际上是数据结构,捕获很多东西意味着传递一个大型数据结构,通常是按值传递。执行此类操作的代码也更难验证,因为并不总是清楚捕获了什么以及意外使用了什么。使用 lambda 捕获来避免提供参数只是纯粹的懒惰。
    • @Peter [&] 只捕获它需要的内容。与手动拼写捕获相比,没有任何开销。
    • @g0x0 个人更喜欢只列出被捕获的变量,因为它更好地表明了需要什么而不是不需要什么的意图。如果您确实需要捕获这么多数据,您可能需要考虑使用struct 或class 来包装数据。
    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 2010-09-23
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2010-12-28
    相关资源
    最近更新 更多