我在玩 bind,我在想,lambdas 和函数指针一样贵吗?
我的意思是,据我了解 lambda,它们是函子的语法糖,并且 bind 是相似的。但是,如果您这样做:
#include<functional>
#include<iostream>
void fn2(int a, int b)
{
std::cout << a << ", " << b << std::endl;
}
void fn1(int a, int b)
{
//auto bound = std::bind(fn2, a, b);
//static auto bound = std::bind(fn2, a, b);
//auto bound = [&]{ fn2(a, b); };
static auto bound = [&]{ fn2(a, b); };
bound();
}
int main()
{
fn1(3, 4);
fn1(1, 2);
return 0;
}
现在,如果我使用 1st auto bound = std::bind(fn2, a, b);
,我会得到一个输出
3、4,第二个我得到1, 2
3、4. 第三个和第四个我得到像第一个一样的输出。3、4
现在我明白了为什么第一个和第二个以这种方式工作,它们在函数调用开始时被初始化(静态的,只有第一次被调用)。然而,3 和 4 似乎有编译器的魔力,其中生成的函子并没有真正创建对封闭范围变量的引用,而是实际上锁定了符号,无论它是否仅在第一次或每次初始化。
有人可以澄清这里实际发生的事情吗?
编辑:我缺少的是使用static auto bound = std::bind(fn2, std::ref(a), std::ref(b));
它作为第四个选项。