Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C+中lambda的类型+; 我试图在C++中学习lambdas,但遇到了一些我不太懂的东西。_C++_Lambda - Fatal编程技术网

C+中lambda的类型+; 我试图在C++中学习lambdas,但遇到了一些我不太懂的东西。

C+中lambda的类型+; 我试图在C++中学习lambdas,但遇到了一些我不太懂的东西。,c++,lambda,C++,Lambda,以下是代码: #include <iostream> typedef double Func(double); double applyFunc(Func f, double x) { return f(x); } int main() { std::cout << applyFunc([](double x) {return x + 1;}, 3) << std::endl; } 然后我从编译器中得到一个错误: In functio

以下是代码:

#include <iostream>

typedef double Func(double); 

double applyFunc(Func f, double x)
{
    return f(x);
}

int main()
{
    std::cout << applyFunc([](double x) {return x + 1;}, 3) << std::endl;
}
然后我从编译器中得到一个错误:

In function ‘int main()’:
error: cannot convert ‘main()::__lambda0’ to ‘double (*)(double)’ for argument ‘1’ to ‘double applyFunc(double (*)(double), double)’
  3) << std::endl;
   ^
函数“int main()”中的
:
错误:无法将参数“1”的“main():::”转换为“double(*)(double)”,将其转换为“double applyFunc(double(*)(double),double”

3) lambda只有在没有捕获的情况下才可转换为函数指针,我们可以通过查看标准草案部分
5.1.2
lambda表达式(强调我的):

没有lambda捕获的lambda表达式的闭包类型具有 公共非虚拟非显式常量到指针的转换函数 具有与闭包相同的参数和返回类型的函数 类型的函数调用运算符。此转换返回的值 函数应为调用时具有 与调用闭包类型的函数调用操作符的效果相同

这是一种不依赖于此转换的替代解决方案:

template <typename Callable>
double applyFunc(Callable f, double x)
{
    return f(x);
}
模板
双applyFunc(可调用f,双x)
{
返回f(x);
}
更新


如果您对使用
std::function
和模板之间的区别感兴趣,那么您应该阅读。这里有很多好的答案,也有很多值得思考的地方

每个lambda表达式返回一个具有不同类型的对象。如果lambda表达式未捕获任何变量,则可以将其转换为具有适当签名的函数指针类型(即,返回类型和参数需要与lambda表达式的类型和参数一致)。当捕获变量时,创建的实体不能用普通函数表示。相反,lambda表达式生成一个类类型的对象,该对象带有一个函数调用操作符。也就是说,第二段代码使用lambda表达式生成一个类的对象,该类的对象大致相当于:

class lambda {
     int n;
public:
     lambda(int n): n(n) {}
     double operator()(double x) const { return x + n; }
};

std::function可以是可选解决方案。指向函数的指针不可能存储
n
。编译器错误告诉您lambda函数无法转换为函数指针。您只需要将其转换为std::function对象。此处不需要
std::function
。推断出一个表示任何可调用类型的模板参数。@chris;啊,我不知道。我以为他在函数指针签名方面遇到了问题。非常感谢!所以,据我所知,有两种方法可以将输入参数的类型定义为函数:从模板推断类型或使用std::function。两者都在发挥作用,并产生相同的结果。我想知道,在什么情况下我必须使用std::function?@Ganil我更新了我的答案,并添加了一个链接,链接到了一个极好的问题,这个问题涵盖了这一点,我不可能用摘要来公正地回答这些问题。
class lambda {
     int n;
public:
     lambda(int n): n(n) {}
     double operator()(double x) const { return x + n; }
};