用 int 类型声明 lambda 不起作用[关闭]

Posted

技术标签:

【中文标题】用 int 类型声明 lambda 不起作用[关闭]【英文标题】:Declaring lambda with int type not working [closed] 【发布时间】:2021-11-24 07:24:51 【问题描述】:

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

vector<int> v;

/* ... */

int median = [](vector<int> a)

    sort(a.begin(), a.end());
    return a[a.size() / 2];
 

我创建了一个 lambda 函数,但我该如何调用它? int median = [](vector&lt;int&gt; a) ... (v)?但它也不起作用。

我只在一些示例中看到过 lambda 函数,例如制作自定义比较器。我可以让它在我的情况下工作吗?

【问题讨论】:

lambda函数不是int类型...可以使用auto median = 或者在(v);的地方调用 为什么不是int类型?我正在返回一个数组元素,所以它应该是int? 您正在返回 lambda 函数,因为它没有就地调用。 @RussianStranger lambda 是一个可调用对象int 完全不同。 【参考方案1】:

我可以让它在我的情况下工作吗?

是的,你可以。你可以叫它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


参考:How to immediately invoke a C++ lambda?

或定义 lambda 并稍后调用它。

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

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

来自cppreference.com

lambda 表达式是 唯一的未命名非联合非聚合类类型的纯右值表达式,称为闭包类型,它在最小块范围内声明(为了 ADL 的目的),包含 lambda 表达式的类范围或命名空间范围。

【讨论】:

另一种情况可能是“无捕获 lambdas”也可以存储在类型化函数指针中。我希望这个问题太深入了(IMO)。【参考方案2】:

'median' 是一个函数,但你可以像这样声明返回类型。

#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];
; 

【讨论】:

auto 是声明 lambda 的更好方法。 同意。我的只是为了清楚起见。

以上是关于用 int 类型声明 lambda 不起作用[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如果我在函数顶部切换注释行的位置,为啥我的代码不起作用?这是一个记忆召回声明[关闭]

委托与Lambda表达式

短到 Int 类型转换不起作用,为啥?

Integer与int

Discord.js 类型/声明扩展不起作用

不完整类型的无效使用,前向声明不起作用