题目描述
看了一篇文章,其中有一段是关于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;
}
functional
里面有定义了个std::plus。如果把plus定义为global的,访问时在global查找定义就会和std::plus
冲突,产生二义。p.s. 不建议直接用
using namespace std;