声明具有 int 类型的 lambda 不起作用

Declaring lambda with int type not working

我想以某种方式使用 lambda 函数,但它不起作用,我也不知道为什么。

vector<int> v;

/* ... */

int median = [](vector<int> a)
{
    sort(a.begin(), a.end());
    return a[a.size() / 2];
} 

我创建了一个 lambda 函数,但我该如何调用它? int median = [](vector<int> a) { ... } (v)?但是也不行。

我只在一些示例中看到过 lambda 函数,例如制作自定义比较器。我能否以某种方式使其适用于我的情况?

'median' 是一个函数,但您可以像这样声明 return 类型。

#include<functional>
vector<int> v;

/* ... */

std::function<int(vector<int>)> median = [](vector<int> a)->int
{
    sort(a.begin(), a.end());
    return a[a.size() / 2];
}; 

Can I make it work in my case somehow?

是的,你可以。您可以将其命名为 immediately after the definition:

int median = [](std::vector<int> a) {
    std::sort(a.begin(), a.end());
    return a[a.size() / 2];   
}(v); 
//^^  --> invoke immediately with argument


参考:

或定义 lambda 并稍后调用它。

/* const */ auto median = [](std::vector<int> a) { ...}
int res = median(v);

请注意,我使用了 auto 类型来指定 lambda 函数的类型。这是因为,lambda 有所谓的 闭包类型 ,我们只能通过 auto 或任何 类型的擦除机制 来提及它比如std::function.

来自cppreference.com

The lambda expression is a prvalue expression of unique unnamed non-union non-aggregate class type, known as closure type, which is declared (for the purposes of ADL) in the smallest block scope, class scope, or namespace scope that contains the lambda expression.