用 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<int> 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 不起作用[关闭]的主要内容,如果未能解决你的问题,请参考以下文章