函数返回一个lambdaexpression式

我不知道是否有可能编写一个函数,返回在C ++ 11中的lambda函数。 当然一个问题是如何声明这样的function。 每个lambda都有一个types,但是这种types在C ++中是不可expression的。 我不认为这会工作:

auto retFun() -> decltype ([](int x) -> int) { return [](int x) { return x; } } 

也不是这样:

 int(int) retFun(); 

我不知道从lambdas到指向函数的指针等的自动转换。 是唯一的解决scheme手工制作一个函数对象并返回它?

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

 std::function<int (int)> retFun() { return [](int x) { return x; }; } 

对于这个简单的例子,你不需要std::function

从标准§5.1.2/ 6:

没有lambda捕获lambdaexpression式的闭包types具有公共的非虚拟非显式const转换函数,指向具有与闭包types的函数调用运算符相同的参数和返回types的函数。 这个转换函数返回的值应该是被调用的函数的地址,和调用闭包types的函数调用操作符一样。

因为你的函数没有捕获,这意味着lambda可以被转换为int (*)(int)types的函数的指针:

 typedef int (*identity_t)(int); // works with gcc identity_t retFun() { return [](int x) { return x; }; } 

这是我的理解,纠正我,如果我错了。

你可以从其他lambda函数返回lambda函数,因为你不应该明确指定lambda函数的返回types。 只要在全球范围内写下这样的东西:

  auto retFun = []() { return [](int x) {return x;}; }; 

虽然这个问题特别提到了C ++ 11,但是为了那些偶然发现并能够访问C ++ 14编译器的人,C ++ 14现在允许为普通函数推导返回types。 因此,可以调整问题中的示例,只需简单地通过在函数参数列表后面删除-> decltype …子句即可:

 auto retFun() { return [](int x) { return x; } } 

但是请注意,如果多于一个return <lambda>; ,这将不起作用return <lambda>; 出现在function中。 这是因为返回types推导的限制是所有返回语句都必须返回相同types的expression式,但是每个lambda对象都被编译器赋予了自己的唯一types,所以return <lambda>; expression式将会有不同的types。