Bar*_*ski 85 c++ lambda function c++11
我想知道是否可以在C++ 11中编写一个返回lambda函数的函数.当然一个问题是如何声明这样的功能.每个lambda都有一个类型,但是这种类型在C++中是不可表达的.我不认为这会奏效:
auto retFun() -> decltype ([](int x) -> int)
{
    return [](int x) { return x; }
}
这不是:
int(int) retFun();
我不知道从lambdas到函数指针或类似函数的任何自动转换.手工制作函数对象并返回它的唯一解决方案是什么?
Sea*_*ean 95
你不需要一个手工制作的函数对象,只需使用std::function,lambda函数可以转换为:
std::function<int (int)> retFun() {
    return [](int x) { return x; };
}
use*_*498 29
对于这个简单的例子,你不需要std::function.
从标准§5.1.2/ 6开始:
没有lambda-capture的lambda表达式的闭包类型有一个公共的非虚拟非显式const转换函数,用于指向具有与闭包类型的函数调用操作符相同的参数和返回类型的函数.此转换函数返回的值应为函数的地址,该函数在调用时与调用闭包类型的函数调用运算符具有相同的效果.
因为你的函数没有捕获,这意味着lambda可以转换为指向类型函数的指针int (*)(int):
typedef int (*identity_t)(int); // works with gcc
identity_t retFun() { 
  return [](int x) { return x; };
}
这是我的理解,如果我错了,请纠正我.
dzh*_*oev 20
您可以从其他lambda函数返回lambda函数,因为您不应该显式指定lambda函数的返回类型.只需在全局范围内编写类似的内容:
 auto retFun = []() {
     return [](int x) {return x;};
 };
Ant*_*all 15
虽然这个问题专门询问了C++ 11,但是为了其他偶然发现并且可以访问C++ 14编译器的人,C++ 14现在允许推导出普通函数的返回类型.因此,只需-> decltype在函数参数列表后面删除...子句,就可以根据需要调整问题中的示例.
auto retFun()
{
    return [](int x) { return x; }
}
但请注意,如果return <lambda>;函数中出现多个,则无法使用此功能.这是因为对返回类型推导的限制是所有返回语句必须返回相同类型的表达式,但编译器为每个lambda对象赋予其自己的唯一类型,因此return <lambda>;表达式将各自具有不同的类型.
| 归档时间: | 
 | 
| 查看次数: | 26988 次 | 
| 最近记录: |