只在本地使用 lambda 可以吗?

Is it ok to use lambda just locally?

是否可以定义一个只在本地使用的 lambda 函数,即在当前块中 (function/method)?考虑某些代码将被执行多次的情况(因此将其放入函数中是合乎逻辑的)但它永远不会在块外使用。

void foo() {
    auto bar = []() {
        // some code applicable only inside foo()
    };

    bar();
    bar();
    bar();
}

与将 bar() 声明为普通函数相比,这种方法的优点和缺点是什么?

如果这样做的选项可用,那么是的,将 lambda bar 本地化到特定函数。

在 C++ 中,我们总是尽量将对象保持在本地。 (使代码更易于理解,简化文档,促进重构,&c. &c..)

你可以的。主要问题是它会更具可读性吗?把它放在外面可以减少一级缩进。

你应该问的问题:

  1. bar是短函数吗?
  2. 是纯函数,还是修改了什么?
  3. 它是否与 foo 紧密相关,或者可以在其他地方重复使用?
  4. 你想要另一个级别的缩进吗?

我同意这是一个很好的做法。高级逻辑几乎总是比低级逻辑更容易阅读。我经常这样写函数:

void foo()
{
  // introduce actors here
  auto something = make_something();

  // introduce detailed definitions
  auto bing = [&]()->bool { ... };  // define what binging means

  auto bong = [&]() { ... };  // define what bonging means

  // perform logic
  while (bing())
    bong();
}

请记住,从 c++17 开始,lambda 表达式默认为 constexpr。海湾合作委员会等阿尔。经常完全优化它们。 None 这是性能方面的考虑。

从 correctness/standard 的角度来看,这当然可以。除此之外,这个问题主要是 opinion-based.

Lambda 是 C++ 中的众多工具之一。他们在 "copy-paste for reuse"(代码味道)和 "extract it into a function" 之间添加了另一层结构。我个人喜欢 function-local lambdas 正是出于所列目的:您正在重用一小段仅在此函数范围内有意义的代码。

有人认为它仍然应该是它自己的函数(因为你所有的函数都是 5 行或更短的,对吧?好吧,我对此表示怀疑......)。特别是,如果您想重用该 lambda 代码,它应该绝对 是它自己的函数。但在此之前,值得考虑将此代码 放在使用位置旁边 的好处,而不是滚动屏幕或更多屏幕。此外,这两种方法都为操作命名,但 lambda 需要较少的写入开销(例如私有成员函数膨胀)。在同一页上,将私有成员函数添加到 header 会触发重新编译,而在 .cpp 中添加 lambda 则不会。

最后,考虑什么可以使代码最具可读性。如果使用 lambda 或将其提取到函数中在代码清晰度上的差异很小(并非不可能),那么 编写 代码的便利性开始变得重要,为此,上述考虑来自开始玩了。

至于测试,这取决于你想fine-grained如何测试。像 return a && b && (a == b); 这样的 lambda 表达式真的需要测试吗?如果它只是内联使用(即不提取为 lambda 或函数),您会测试它吗?在某些时候它变成了浪费时间,但是在 SO 答案中不可能确定这一点。

这没有错,实际上这是 lambda 的一大优势:您可以在需要的地方本地定义它们,而不必编写仿函数类型。如果您想 define/declare 在尽可能小的范围内处理您的内容,那么 lambda 是您的朋友。

你甚至可以更进一步,做这样的事情:

 auto bar = []() {return true;}();

它定义了 lambda 并在一行中调用它。