我想知道是否有可能用C++11编写一个返回lambda函数的函数,当然其中一个问题是如何声明这样的函数。每个lambda都有一个类型,但是该类型在C++中是不可表达的。我不认为这是可行的:
auto retFun() -> decltype ([](int x) -> int)
{
return [](int x) { return x; }
}
也不是这样:
int(int) retFun();
我没有注意到任何从lambda到函数指针之类的自动转换。手工创建一个函数对象并返回它是唯一的解决方案吗?
发布于 2011-01-19 01:22:49
你不需要手工制作的函数对象,只需要使用std::function
,lambda函数是可以转换的:
此示例返回整数标识函数:
std::function<int (int)> retFun() {
return [](int x) { return x; };
}
发布于 2011-11-06 01:27:19
您可以从其他lambda函数返回lambda函数,因为您不应该显式指定lambda函数的返回类型。只需在全局范围内编写类似的代码:
auto retFun = []() {
return [](int x) {return x;};
};
发布于 2016-06-18 07:40:32
虽然这个问题特别问到了C++11,但为了让其他偶然发现这一点的人能够使用C++14编译器,C++14现在允许为普通函数推断返回类型。因此,问题中的示例只需通过删除-> decltype
就可以根据需要进行调整。函数参数列表后面的子句:
auto retFun()
{
return [](int x) { return x; }
}
但是,请注意,如果函数中出现多个return <lambda>;
,这将不起作用。这是因为对返回类型推导的限制是,所有返回语句必须返回相同类型的表达式,但是编译器为每个lambda对象指定了自己的唯一类型,因此return <lambda>;
表达式将具有不同的类型。
https://stackoverflow.com/questions/4726768
复制相似问题