将带有变量捕获的lambda表达式转换为函数指针

时间:2015-07-24 13:10:16

标签: c++ lambda

我试图使用lambda函数快速测试出来的东西,而且我正在用它跑墙。我不知道为什么事情不能起作用(我觉得)应该是。

这正如我所料:

double(*example)(double) = [](double S)->double {return std::max(1-100/S, 0.0) * LogNormal(S, 100, 0.25); };
NewtonCotes(lowerBound, upperBound, example, intervals, order)

然而,这不是:

double(*example)(double) = [K](double S)->double {return std::max(1 - K / S, 0.0) * LogNormal(S, 100, 0.25); };

给出错误:

  

错误:没有合适的转换函数来自" lambda [] double(double S) - > double" to" double(*)(double)"存在。

我不明白为什么在捕获列表中添加内容会改变这里发生的事情。我在C ++中对lambdas来说相当新,所以可能会在某个地方犯一个愚蠢的错误......

我需要做些什么才能让它发挥作用?我已经看到一些人注意到intellisense中存在一个错误,并且这样的事情应该有效,尽管这是一个稍微不同的问题(至少我没有认为它们完全匹配)。我也使用的是VS2013,而不是2011年提到该bug的地方。

1 个答案:

答案 0 :(得分:3)

原因是捕获 - 如果lambda捕获任何东西,如果不能表示为函数指针。

如果您认为捕获编译器必须创建的新类型以存储捕获的变量并提供非静态operator(),那么这是有意义的 - 因此lambda表达式返回的对象具有状态而不能转换为普通函数指针。