当前位置: 首页 > 知识库问答 >
问题:

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

西门建安
2023-03-14

我正在尝试使用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)-

我不明白为什么在捕获列表中添加一些内容会改变这里的情况。我对C语言中的lambdas还比较陌生,所以可能在某个地方犯了一个愚蠢的错误。。。

我需要做些什么来让它工作?我看到一些人指出intellisense中有一个bug,类似这样的东西应该可以工作,尽管这是一个稍微不同的问题(至少我不认为它们完全匹配)。我还使用VS2013,而不是2011年提到的那个bug。

共有1个答案

姬银龙
2023-03-14

原因是捕获——如果lambda捕获了任何不能用函数指针表示的东西。

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

 类似资料:
  • 我创建了2个函数,读取和写入一个路径,声明为: 我创建了一个额外的函数,它将使用路径调用上述函数之一 但是,当作为回调传递给时,编译器会发出以下警告 将“int(const char*,const void,int)”传递给类型为“int()(const char*,void*,int)”的参数的指针类型不兼容 将接受常量指针的函数转换为接受非常量指针的函数会是未定义的行为吗? 我注意到有一个几乎

  • 我有一个C语言函数要调用: 我有一个回调的静态类方法: 我可以这样调用函数: 但是,我现在必须将回调改为非静态,因为我必须创建多个< code>A对象。 但是我不能更改< code>f_api()的定义。 我尝试使用lambda: 但是这失败了,因为我不能把一个带有capture的lambda转换成一个简单的函数指针。 也不能做这项工作,因为定义。 我能做什么?如何从lambda表达式获取函数指针

  • 对不起,我不知道这个问题的标题是什么。 我在C中有一个函数,它以λ作为参数。 然后我尝试调用这个函数。 我的问题是,我无法从lambda函数内部访问变量,如果我试图用

  • 这将分别打印出1,2,3,这就是我希望它工作的方式。下面是我的自定义函数: 上面的函数是正确的吗?它镜像了lambda表达式,我们可以按原样详细说明每个步骤?我已经尽力了。 正如我在上面提到的,为了镜像第一个lambda表达式,我一直在开发一个函数,因此我不知道该表达式是如何工作的。有谁能帮我解释一下这个lambda是怎么工作的吗;我有一段时间一直在试图理解在函数执行时函数体中的名称是如何和为什么

  • 我正在尝试执行以下操作(cb=CriteriaBuilder): 但我得到以下语法错误: 绑定不匹配:(表达式之间的泛型方法 是否可以转换表达式

  • 主要内容:用数组作函数参数在C语言中,函数的参数不仅可以是整数、小数、字符等具体的数据,还可以是指向它们的 指针。用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着函数的结束而被销毁。 像数组、字符串、动态分配的内存等都是一系列数据的集合,没有办法通过一个参数全部传入函数内部,只能传递它们的指针,在函数内部通过指针来影响这些数据集合。 有的时候,对于整数、小数