【发布时间】:2011-06-11 05:42:05
【问题描述】:
我想知道是否可以在 C++11 中编写一个返回 lambda 函数的函数。当然,一个问题是如何声明这样的函数。每个 lambda 都有一个类型,但该类型在 C++ 中是不可表达的。我认为这行不通:
auto retFun() -> decltype ([](int x) -> int)
{
return [](int x) { return x; }
}
也不是这样:
int(int) retFun();
我不知道有任何从 lambda 到函数指针等的自动转换。唯一的解决方案是手工制作函数对象并返回它吗?
【问题讨论】:
-
补充一下已经说过的,无状态的 lambda 函数可以转换为函数指针。
-
IMO 您的第一个选项将不起作用,因为
decltype中的 lambda 与函数体中的不同,因此具有不同的类型(即使您包含 return 语句) -
顺便说一句,如果 lambda 有一个空的捕获子句,它可以隐式转换为指向函数的指针。
-
@GMan:除非您使用 Visual C++ 2010 或大约一年前(或大约)发布的 g++ 版本。直到 2010 年 3 月在 N3092 中才添加了到函数指针的无捕获 lambda 隐式转换。
-
Lambda 表达式一般不能出现在未计算的操作数中。所以
decltype([](){})或sizeof([]() {})无论你写在哪里都是格式错误的。