代码之家  ›  专栏  ›  技术社区  ›  choxsword

没有捕获列表的lambda通常是作为普通函数实现的吗?[关闭]

  •  0
  • choxsword  · 技术社区  · 6 年前

    这个问题来源于另一个问题 Why isn't a lambda that captures variables by reference convertible to a function pointer? . 似乎带有捕获列表的lambda是作为带有 operator () .

    据我所知,没有捕获列表的lambda可以转换为一个函数指针,这看起来像是一个普通的函数。更重要的是,在将没有捕获列表的lambda与普通函数进行比较时,我找不到任何特别的地方。

    同时,我认为没有必要将没有捕获列表的lambda作为普通函数来实现。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Rakete1111    6 年前

    更重要的是,在将没有捕获列表的lambda与普通函数进行比较时,我找不到任何特别的地方。

    试着接受 sizeof 从一个函数,然后从一个非捕获lambda。您会注意到函数没有大小(因此无法编译),而lambda有大小(几乎总是1)!

    因此编译器无法为非捕获lambda生成普通函数。注意,它可以并实现类似规则下lambda函数的异常,但我不会将其称为普通函数。

    通过使调用操作符成为静态的或围绕它工作(编译器可以做很多我们不能做的事情),到函数指针的转换可以工作。

        2
  •  1
  •   Jarod42    6 年前

    与常规函数相比,结构函数的优点在于保持类型,这可能有助于内联:

    std::sort(std::begin(v), std::end(v), &function);
    

    必须记住函数的值 bool (*)(const T&, const T&) 允许嵌入。

    鉴于:

    std::sort(std::begin(v), std::end(v),
              [](const T& lhs, const T& rhs){ return function(lhs, rhs);});
    

    我们随时都有价值 comparer . 没有额外的工作来记住初始值