Function 为什么要写C++;有名字的lambda可以从某处调用吗? 为什么一个名字写C++ lambda,所以它可以从某处调用?这难道不会挫败lambda的初衷吗?在那里写函数更好吗?若否,原因为何?函数会有什么缺点吗?

Function 为什么要写C++;有名字的lambda可以从某处调用吗? 为什么一个名字写C++ lambda,所以它可以从某处调用?这难道不会挫败lambda的初衷吗?在那里写函数更好吗?若否,原因为何?函数会有什么缺点吗?,function,c++11,lambda,Function,C++11,Lambda,这基本上是一个基于意见的问题。这取决于您,无论您喜欢函数还是lambda,它们都是等价的。当您需要来自周围环境的变量时,lambda会发光。您只需捕获它们,而不是将其作为参数传递,这很好 但是除此之外,没有区别。这种方法的一个用途是让函数访问封闭范围 在C++中,我们没有嵌套函数,就像我们在其他语言中所做的那样。 有一个命名的lambda解决了这个问题。 例如: #include <iostream> int main () { int x; auto fun =

这基本上是一个基于意见的问题。这取决于您,无论您喜欢函数还是lambda,它们都是等价的。当您需要来自周围环境的变量时,lambda会发光。您只需捕获它们,而不是将其作为参数传递,这很好


但是除此之外,没有区别。

这种方法的一个用途是让函数访问封闭范围

在C++中,我们没有嵌套函数,就像我们在其他语言中所做的那样。 有一个命名的lambda解决了这个问题。 例如:

#include <iostream>

int main ()
{
    int x;

    auto fun = [&] (int y) {
        return x + y;
    };

    std::cin >> x;

    int t;
    std::cin >> t;
    std::cout << fun (fun (t));
    return 0;
}
#包括
int main()
{
int x;
自动娱乐=[&](整数y){
返回x+y;
};
标准:cin>>x;
int t;
标准:cin>>t;

Std::Couth

我在选择一个命名的LAMDBA和一个自由函数时看到三件事:

  • 您是否需要周围范围中的变量?如果需要,请选择一个lamdba并利用其闭包。否则,请使用自由函数(因为3.)
  • 是否可以将闭包状态同样作为函数参数传递?如果是,考虑优选一个自由函数(因为3)。
  • 是否要为可调用函数编写测试和/或在多个转换单元中重用它?如果是,请选择一个自由函数,因为您必须在头文件中声明它,并在lamdba闭包中捕获变量

    • 在头文件中有点混乱(当然,这是有争议的)

    • 需要已知类型。因此,您无法使用函数参数和返回类型的前向声明来减少编译时间


  • 使用名称的一个很好的理由是表达意图。然后可以检查lambda是否做了“正确的事情”,读者可以检查意图。给定:

    std::string key;
    std::map<std::string, int> v;
    
    但很难说它是否做了“正确的事情”。然而,如果我们详细说明:

    auto matches_key = [&](auto const& elem){ return elem.first == key; };
    
    std::find_if( v.begin(), v.end(), matches_key );
    

    更清楚的是,我们确实希望进行相等比较,并且提高可读性。

    当lambda本身是一个递归函数时,您别无选择,只能给它命名。此外,
    auto
    关键字也不够,您必须使用带有返回类型和参数列表的
    std::function
    来声明它

    下面是返回第n个斐波那契数的函数示例:

    std::function<int(int)> fibonacci = [&](int n) {
        if (n == 0 || n == 1) {
            return 1;
        } else {
            return fibonacci(n - 1) + fibonacci(n - 2);
        }
    }
    
    std::函数fibonacci=[&](int n){
    如果(n==0 | | n==1){
    返回1;
    }否则{
    返回斐波那契(n-1)+斐波那契(n-2);
    }
    }
    

    为了用
    &
    捕获它,您必须给它一个名称。
    auto
    不起作用,因为lambda在调用自己之前需要知道它的类型。

    但是在这种情况下,因为您只使用了lambda一次,它可以用
    std::cout内联函数编写和执行,如果需要周围的变量吗?@GemTaylor我已经做了一次编辑以合并您的概念。@user9639921有其他方法来实现与嵌套函数的相似性。这是一个相关的问题。@Gassa是的,您可以使用局部类的静态成员。这是我们在'11'之前必须做的。lambda比这更好,编译器可以优化很容易地去掉“函数指针”。毫不奇怪,lambdas的参考实现就是这样。如果下面的答案之一解决了您的问题,您应该接受它(单击相应答案旁边的复选标记)。这样做有两件事。它让每个人都知道你的问题已经解决到令你满意的程度,并且它给了帮助你的人一个充分的解释。从实际的角度来看,这甚至更重要。
    
    std::function<int(int)> fibonacci = [&](int n) {
        if (n == 0 || n == 1) {
            return 1;
        } else {
            return fibonacci(n - 1) + fibonacci(n - 2);
        }
    }