一个没有捕获列表的lambda通常实现为普通函数吗?

时间:2018-05-22 08:45:24

标签: c++ c++11 lambda

这个问题起源于Why isn't a lambda that captures variables by reference convertible to a function pointer? 的另一个问题。看起来带有捕获列表的lambda被实现为具有operator ()的本地类。

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

与此同时,我认为没有必要在没有捕获列表的情况下不实现lambda作为普通函数。

2 个答案:

答案 0 :(得分:1)

  

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

尝试获取函数的sizeof,然后从非捕获的lambda中获取。您会注意到该函数没有大小(因此无法编译),而lambda(它几乎总是1)!

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

通过使调用操作符静态或解决它(编译器可以执行许多我们无法解决的事情),转换为函数指针可以正常工作。

答案 1 :(得分:1)

结构仿函数优于常规函数的优点是保留类型,这可能有助于内联:

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

必须记住& 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的任何时候都有价值。没有额外的工作来记住初始值