函数返回一个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。