&&对lambda表达式有什么好处?

What is the benefit of && on a lambda-expression?

本文关键字:什么 lambda 表达式      更新时间:2023-10-16

我看到的代码如下所示:

template<class Function>
void MyFunc(Function&& function) { function(...); }

与仅按值复制函数相比,此处&&的优势是什么?作为参考,我使用的是 C++14。

问题来自避免复制。

想象一下:

auto lambda = [ptr = std::make_unique<int>(0)]() mutable {
std::cout << *ptr;
ptr = std::make_unique<int>(*ptr + 1); // why not?
};
MyFunc(lambda);                     // use it normally
MyFunc([]{ std::cout << " end"; }); // use by using a temporary lambda
lambda()                            // just call the function after that

如果签名是MyFunc(Function f)的,则需要std::move,并且在调用后lambda将不可用。

如果签名是MyFunc(Function const& f)的,它将不起作用,因为lambda是可变的。

如果是MyFunc(Function& f),那么临时将不起作用。

你基本上只剩下MyFunc(Function&& f).


然而,真正的问题是"我需要支持所有这些案例吗?

我会说:大多数时候没有。大多数情况下,按值接收 lambda 是最简单的,几乎支持所有情况。STL就是这样走的。

为什么?因为函数对象的完美转发真的很难做到完美,而且在大多数情况下,你不能以非常通用的方式多次调用函数。只有当我想包装函数,想要完全避免复制并且我希望函数对象符合临时引用条件时,我才会完善转发函数。