可以在c11中编译这些代码
double(*p1)(double) = [](double a) { return sqrt(a); };
double(*p2)(double) = [&](double a) { return sqrt(a); };
但是在c17中编译存在以下错误
double(* p2)(double)= [&](double a){return sqrt(a); };
在初始化时无法将test_pointer_to_function :: test_method()::
转换为double(*)(double)double(* p2)(double)= [&](double a){return sqrt(a ); };
此lamda函数的正确类型是什么?
答案 0 :(得分:1)
对于带有非空 lambda-capture 的lambda表达式,没有“正确”的函数指针类型。这样的关闭对象不能转换为普通的函数指针。
如果您希望能够将闭包对象转换为普通函数指针类型,请确保lambda表达式的[]
部分中没有任何内容。这适用于C ++ 11及更高版本,包括C ++ 17。
答案 1 :(得分:1)
每个lambda都有自己独特的类型。通常,如果需要为变量分配lambda,请使用auto
作为其类型。如果您需要已知的类型(例如,要将lambda存储在容器中),则可以使用std::function
,其签名与lambda相同。在您的示例中,这将是
std::function<double(double)> p2 = [&](double a) { return sqrt(a); };
(但请注意,通常这样会降低效率)。
仅非捕获的lambda,即具有空[]
的lambda,可以转换为函数指针,例如您的示例:
double(*p1)(double) = [](double a) { return sqrt(a); };
您的C ++ 11编译器不应该接受
double(*p2)(double) = [&](double a) { return sqrt(a); };