为什么lambda变量作为全局变量不支持作为函数参数传入

题目描述

看了一篇文章,其中有一段是关于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;
}
阅读 3k
1 个回答

functional里面有定义了个std::plus。如果把plus定义为global的,访问时在global查找定义就会和std::plus冲突,产生二义。

p.s. 不建议直接用using namespace std;

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题