【问题标题】:Converting a lambda expression with variable capture to a function pointer [duplicate]将具有变量捕获的 lambda 表达式转换为函数指针
【发布时间】:2015-10-15 04:17:04
【问题描述】:

我正在尝试使用 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”到“double(*)(double)”的合适转换函数。

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

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

【问题讨论】:

  • 参见Passing lambda as function pointer ... tl;dr lambda 只能在不捕获的情况下转换为函数指针。
  • @ShafikYaghmour 是的,当您有答案时,您并不是在开玩笑地标记重复项...
  • 我确实搜索过重复项,但我只是今天才开始看这个,所以当我说它对我来说是新的时,我的意思是它真的很新!
  • @在 SO 上一定程度的重复是不可避免的,你收到了两个赞成票,这表明这是一个好问题,它已经被回答了。

标签: c++ lambda


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 2018-10-29
    • 2018-06-15
    相关资源
    最近更新 更多