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

wil*_*ill 7 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)
Run Code Online (Sandbox Code Playgroud)

然而,这不会:

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

给出错误:

错误:不存在从“lambda []double(double S)->double”到“double(*)(double)”的合适转换函数。

我不明白为什么在捕获列表中添加一些东西会改变这里发生的事情。不过,我对 C++ 中的 lambdas 还很陌生,所以可能在某处犯了一个愚蠢的错误......

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

Ale*_*bin 5

原因是捕获 - 如果 lambda 捕获任何不能表示为函数指针的内容。

如果您认为要捕获任何变量,编译器必须创建一个新类型来存储捕获的变量并提供非静态变量,那么这是有道理的operator()- 因此 lambda 表达式返回的对象具有状态并且无法转换为普通函数指针。