首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >返回lambda表达式的函数

返回lambda表达式的函数
EN

Stack Overflow用户
提问于 2011-01-19 01:01:00
回答 5查看 37.9K关注 0票数 97

我想知道是否有可能用C++11编写一个返回lambda函数的函数,当然其中一个问题是如何声明这样的函数。每个lambda都有一个类型,但是该类型在C++中是不可表达的。我不认为这是可行的:

代码语言:javascript
复制
auto retFun() -> decltype ([](int x) -> int)
{
    return [](int x) { return x; }
}

也不是这样:

代码语言:javascript
复制
int(int) retFun();

我没有注意到任何从lambda到函数指针之类的自动转换。手工创建一个函数对象并返回它是唯一的解决方案吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-01-19 01:22:49

你不需要手工制作的函数对象,只需要使用std::function,lambda函数是可以转换的:

此示例返回整数标识函数:

代码语言:javascript
复制
std::function<int (int)> retFun() {
    return [](int x) { return x; };
}
票数 106
EN

Stack Overflow用户

发布于 2011-11-06 01:27:19

您可以从其他lambda函数返回lambda函数,因为您不应该显式指定lambda函数的返回类型。只需在全局范围内编写类似的代码:

代码语言:javascript
复制
 auto retFun = []() {
     return [](int x) {return x;};
 };
票数 23
EN

Stack Overflow用户

发布于 2016-06-18 07:40:32

虽然这个问题特别问到了C++11,但为了让其他偶然发现这一点的人能够使用C++14编译器,C++14现在允许为普通函数推断返回类型。因此,问题中的示例只需通过删除-> decltype就可以根据需要进行调整。函数参数列表后面的子句:

代码语言:javascript
复制
auto retFun()
{
    return [](int x) { return x; }
}

但是,请注意,如果函数中出现多个return <lambda>;,这将不起作用。这是因为对返回类型推导的限制是,所有返回语句必须返回相同类型的表达式,但是编译器为每个lambda对象指定了自己的唯一类型,因此return <lambda>;表达式将具有不同的类型。

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4726768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档