账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    为什么lambda变量作为全局变量不支持作为函数参数传入
    • 2019-12-14 00:00
    • 11
    55
    0

    题目描述

    看了一篇文章,其中有一段是关于lambda与std::function之间转换,具体就是将一个lambda变量作为参数传入一个需要std::function<void(Args...)> f 的函数。文章传送门:C ++ 11函数分解–做AOP的简便方法

    因为我不小心将plus这个变量放在了全局段,在调用Plus时报错定义不明确(放在main内部作为局部变量可行)。我以为是匿名函数不能作为全局传值,于是又写了一个测试addPlus,但其是可行的。

    请问,为什么lambda返回的变量不能作为作为函数参数传入?其会被认为是不明确的?能否举一个例子?谢谢

    相关代码

    #include <iostream>
    #include <functional>
    
    using namespace std;
    
    
    template <typename ...Args>
    std::function<void(Args...)> wrapLog(std::function<void(Args...)> f)
    {
        return [f](Args... args) {
            cout << "start" << endl;
            f(args...);
            cout << "finish" << endl;
        };
    }
    
    int a = 10, b = 15;
    int add(int i, int j) {
        return i + j;
    }
    
    auto plus = [](int a, int b) { cout << a + b << endl; };            //error Plus不明确
    
    auto addPlus = [v1 = 1, v2 = 2](int x, int y) -> double{
        return x + y + v1 + v2;
    };
    
    int main(int argc, char *argv[]) {
        int a = 15, b = 15;
        cout << add(a, b) << endl;
        cout << addPlus(a, b) << endl;
    
        //auto plus = [](int a, int b) { cout << a + b << endl; };
        //auto loggedPlus = wrapLog(plus);                                                
        auto loggedPlus = wrapLog(static_cast<std::function<void(int, int)>>(plus));
    
        return 0;
    }
    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    • 在Python中,lambda表达式是一种简洁的匿名函数,通常用于定义单行函数,用于表达式中的简化操作或处理简单的情况。在Python中,lambda表达式是不可变的,也就是说,一旦创建,它就无法修改其参数或返回值。

      这是因为Python中的变量是引用类型,它们存储的是变量的值。当一个变量被赋值时,Python会为其分配内存空间,并将该值作为变量的值存储在内存中。当lambda表达式被赋值时,它会创建一个新的lambda函数对象,而不是在内存中直接分配内存空间。

      因此,当lambda表达式作为函数参数传递时,它不会改变函数内部的lambda函数对象,而只是在函数外部声明了一个新的lambda函数对象。这就意味着,当函数调用lambda表达式时,Python会创建一个新的lambda函数对象,而这个对象在函数内部是不可变的,因此不能作为函数参数传递。

      例如,下面是一个lambda表达式作为函数参数的例子:

      ```python

      创建一个lambda函数对象

      add = lambda x, y: x + y

      将lambda表达式赋值给变量add

      add_value = 5 print(add(add_value, 2)) # 输出: 7 ```

      在这个例子中,lambda表达式add(x, y)创建了一个新的lambda函数对象add_value,然后将add_value赋值给变量add。由于lambda表达式创建了新的lambda函数对象,所以add函数内部的add方法现在被add_value引用,而不是add函数本身。因此,函数调用add(add_value, 2)返回的是add_value的值,而不是add函数本身。

      综上所述,lambda表达式作为函数参数不支持在Python中直接作为函数内部的lambda函数对象,只能作为函数外部声明的一个新函数对象,用于存储一些简单的行为或操作。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部