lamda中的不同类型,在捕获列表中有参考

时间:2018-09-08 02:31:52

标签: c++

可以在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函数的正确类型是什么?

2 个答案:

答案 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); };