有这样一个例子:
#include <iostream>
#include <functional>
void qwer(const std::function<void()> &a)
{
a();
}
int main()
{
int x{0};
auto f{
[x]()mutable
{
std::cout << ++x << std::endl;
}
};
qwer(f);
qwer(f);
qwer(f);
return 0;
}
输出:
1
1
1
有2个问题:
- 为什么编译器不抛出错误?毕竟,函数
qwer正在等待一个函数被传递给它,我们传递给它一个 lambda,据我所知,它不是一个函数。 - 为什么在传递
f给函数时qwer,每次都会创建一个副本f?毕竟,在定义函数qwerusing 时,&我们明确指出我们要使用的不是对象的副本,而是对象本身
如果我理解正确,则会在那里创建一个副本,因为 f 具有不同的类型。但是创建一个显式类型就足够了
一切正常。
让我稍微解释一下问题2。
当您将
qwerlambda 传递给函数时,因为 它需要一个类型的参数function,然后创建一个临时对象,链接指向该对象。您可以通过将此行添加到函数来验证这一点
qwer:lambda 本身
x是按值捕获的,因此每个临时对象都有自己的副本x,您需要 lambda 通过引用来捕获它&x。它在这里以更详细和更智能的语言编写。
也就是说,在您的情况下,
function<void()>&由于类型的差异,引用会导致临时对象。并且 lambda 本身x是按值而不是按引用捕获的,因此每个临时对象都使用x.一些代码: