c++ - 定义 lambda 的一般准则

标签 c++ c++11 lambda

<分区>

现在我们可以在我们的代码库中使用 C++11 lambda,我们正在努力制定应该如何定义和使用它们的一般原则。我意识到这肯定有主观因素,但我认为也可能有一些对社区有用的更通用的经验法则。

定义 lambda 的一般原则是什么?

  • 您什么时候更喜欢通过引用 [&] 或值 [=] 来捕获?性能影响是什么?
  • 您应该在什么时候更喜欢显式捕获变量,例如 [&foo]
  • 在什么情况下应该指定返回类型? (C++14 比 C++11 对推断返回类型有更好的支持)
  • 在最好将 lambda 重写为函数之前,lambda 能有多复杂?

就个人而言,我目前的一般原则是“只要您需要一个简单的谓词或比较器,就使用 lambda”,但这可能意味着我错过了一些更强大的用例。

最佳答案

这些问题有些主观,但我会试一试:

  • 当您需要修改封闭范围内的值(显然),或者当您想要避免复制大量变量时,通过引用捕获;否则按值捕获。

  • 如果您需要在封闭范围内修改特定变量的值而不是其他变量的值,则通过引用捕获特定变量。

  • 我尝试始终指定返回类型以提高可读性(这样其他人可以立即知道返回类型,而不必解析 lambda 来推断它)。

  • 最后一个是最主观的,但我个人认为大于 ~3-5 行的 lambda 应该重构为函数,因为长 lambda 会降低可读性。但是,可能会有很多异常(exception)情况,因此这是个人喜好问题,很大程度上取决于实际代码。

关于c++ - 定义 lambda 的一般准则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20214223/

相关文章:

c++ - 透明的频谱图选择叠加

c++ - 在一个qt项目中创建多个dll

c++ - 使用 std::move 来防止复制

c++ - 智能指针和不可复制的成员字段

c++ - 为什么在声明 move 操作时删除复制操作?

c++ - undefined reference 捕获 lambda 中的静态变量

c++ - 如何使用 cef_menu_handler 创建自己的菜单?

c++ - SSE2 - 16 字节对齐的内存动态分配

python lambda无法检测打包的模块

python - 如何将带有 lambda 函数的 tesseract 压缩文件部署到 aws lambda