- 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 条
- 全部回答
-
青春是一場刻骨的痛゛ 普通会员 1楼
在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函数对象,只能作为函数外部声明的一个新函数对象,用于存储一些简单的行为或操作。
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
