【发布时间】:2020-07-23 13:57:06
【问题描述】:
当使用 lambda 创建 std::function 时,std::function 在内部制作 lambda 对象的副本。因此,我们调用 fn() 实际上是在我们的 lambda 副本上执行的,而不是实际的 拉姆达。
根据上面的陈述,在 std::function 总是复制 lambda 对象时,在下面的代码中通过 'reference using &' 或通过 'value' 传递 lambda 有什么意义?
换句话说,在下面的代码中,当'invoke'函数的参数通过引用或值传递时,lambda的哪一部分将不会被修改/影响?
#include <iostream>
#include <functional>
void invoke(const std::function<void(void)>& fn) // # PASS LAMBDA BY REFERENCE*********************
{
fn();
}
int main()
{
int i{ 0 };
// Increments and prints its local copy of @i.
auto count{ [i]() mutable {
std::cout << ++i << '\n';
} };
invoke(count);
invoke(count);
invoke(count);
return 0;
}
#include <iostream>
#include <functional>
void invoke(const std::function<void(void)> fn) // # PASS LAMBDA BY VALUE*********************
{
fn();
}
int main()
{
int i{ 0 };
// Increments and prints its local copy of @i.
auto count{ [i]() mutable {
std::cout << ++i << '\n';
} };
invoke(count);
invoke(count);
invoke(count);
return 0;
【问题讨论】:
-
lambda 不是
std::function... -
在这两种情况下,您都可以从 lambda 中创建一个临时的
std::function(通过调用)... -
那么使用&运算符有什么意义呢? “(通过电话)”是什么意思?
-
在这种情况下,您最好使用
template <typename Func> void invoke(const Func &func);,这样可以避免将lambda转换为std::function,从而增加开销。 -
它类似于
void foo(const std::string&)vsvoid foo(std::string)而你通过const char*