这个问题起源于Why isn't a lambda that captures variables by reference convertible to a function pointer?
的另一个问题。看起来带有捕获列表的lambda被实现为具有operator ()
的本地类。
据我所知,没有捕获列表的lambda可以转换为函数指针,看起来它只是一个普通的函数。更重要的是,在将没有捕获列表的lambda与普通函数进行比较时,我找不到任何特别的东西。
与此同时,我认为没有必要在没有捕获列表的情况下不实现lambda作为普通函数。
答案 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
的任何时候都有价值。没有额外的工作来记住初始值