【发布时间】:2013-10-09 06:43:48
【问题描述】:
我在玩 bind,我在想,lambda 和函数指针一样贵吗?
我的意思是,据我了解 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;
}
现在,如果我使用第一个 auto bound = std::bind(fn2, a, b);,我会得到 p> 的输出
3、4,第二个我得到1, 2
3, 4。第三个和第四个我得到像第一个一样的输出。3、4
现在我明白了为什么第一个和第二个会这样工作,它们在函数调用开始时被初始化(静态的,只有第一次被调用)。然而,3 和 4 似乎有编译器的魔力,其中生成的函子并没有真正创建对封闭范围变量的引用,而是实际上锁定了符号,无论它是否仅在第一次或每次初始化。
有人可以澄清这里实际发生的事情吗?
编辑:我缺少的是使用static auto bound = std::bind(fn2, std::ref(a), std::ref(b)); 让它作为第四个选项。
【问题讨论】:
-
@JoachimPileborg 不同的结果是
a和b将无法用于 lambda 函数。这很明显。你想给我看什么? -
该死,我的意思是:尝试按值而不是按引用捕获,例如
[=]{ ... }。这就是你使用std::bind时所做的事情,它按值“捕获”变量。 -
@JoachimPileborg 啊,对。如果我在
a和b周围使用std::ref,则第二个像第四个一样工作。谢谢。