我在玩C++ 11的功能特性。我觉得奇怪的一件事是,lambda函数的类型实际上不是函数<>类型。更重要的是,lambda似乎并不能很好地处理类型推入机制。为什么在C++ 11中的lambda函数没有函数<>类型?
附加是一个小例子,我测试了翻转函数的两个参数来添加两个整数。 (我使用的编译器是MinGW下的gcc 4.6.2。)在此示例中,使用函数<>明确定义了addInt_f
的类型,而addInt_l
是类型为auto
的类型推理的lambda。
当我编译的代码,该flip
函数可以接受的明确的类型定义addInt的版本,但不是拉姆达版本,给了一个错误说, testCppBind.cpp:15:27: error: no matching function for call to 'flip(<lambda(int, int)>&)'
接下来的几行表明,拉姆达版本(以及“原始”版本)可以被接受,如果它被明确地转换为适当的功能<>类型。
所以我的问题是:
为什么一个lambda函数没有在首位
function<>
类型?在这个小例子中,为什么addInt_l
不是function<int (int,int)>
而是类型?从函数式编程的角度来看,函数/函数对象和lambda之间有什么区别?如果有一个根本原因,这两个必须是不同的。我听说拉姆达可以转换为
function<>
,但它们不同。这是C++ 11的一个设计问题/缺陷,是一个实现问题,还是在区分两者的方式方面有利?似乎只有addInt_l
的类型签名提供了有关函数的参数和返回类型的足够信息。有没有办法写lambda,以便上述显式类型转换可以避免?
在此先感谢。
//-- testCppBind.cpp --
#include <functional>
using namespace std;
using namespace std::placeholders;
template <typename T1,typename T2, typename T3>
function<T3 (T2, T1)> flip(function<T3 (T1, T2)> f) { return bind(f,_2,_1);}
function<int (int,int)> addInt_f = [](int a,int b) -> int { return a + b;};
auto addInt_l = [](int a,int b) -> int { return a + b;};
int addInt0(int a, int b) { return a+b;}
int main() {
auto ff = flip(addInt_f); //ok
auto ff1 = flip(addInt_l); //not ok
auto ff2 = flip((function<int (int,int)>)addInt_l); //ok
auto ff3 = flip((function<int (int,int)>)addInt0); //ok
return 0;
}
你不应该服用'std :: function'参数,主要是因为它禁止类型推导(这是你的问题)。 – 2012-07-24 10:22:02
相关:[C++ 11不会在涉及std :: function或lambda函数时推导出类型](http://stackoverflow.com/q/9998402/487781) – hardmath 2012-07-24 10:32:41
将Lambdas转换为匿名函子(或函数,如果它们不要捕捉环境)。将它们转换为std :: function将引入语言和库之间的强大耦合,因此将是一个非常糟糕的主意。 – MFH 2012-07-24 10:33:37