&&对lambda表达式有什么好处?
What is the benefit of && on a lambda-expression?
我看到的代码如下所示:
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就是这样走的。
为什么?因为函数对象的完美转发真的很难做到完美,而且在大多数情况下,你不能以非常通用的方式多次调用函数。只有当我想包装函数,想要完全避免复制并且我希望函数对象符合临时引用条件时,我才会完善转发函数。
相关文章:
- 这 4 个 lambda 表达式之间有什么区别?
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- C++:Lambda 函数指针转换的用例是什么?
- Visual C++: MSVC vs. GCC+CLANG: 处理 lambda 捕获类成员变量,正确的方法是什么?
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 传递 lambda 函数的权衡是什么?
- &&对lambda表达式有什么好处?
- 这个size_t在 lambda 中有什么作用?C++代码
- 关于函数模板中定义的 lambda 闭包类型可以说些什么?
- 这个 lambda 的目的是什么?
- C++ : 在 lambda 表达式中捕获的目的是什么?
- lambda 的默认捕获是什么?
- 将函数的引用和 lambda 表达式作为参数传递时有什么区别?
- 这个函数和 lambda 有什么区别?
- 将 lambda 作为模板参数传递:实际推导出什么类型
- 包含通过引用捕获的 lambda 函数的"variable"的类型是什么?
- 我在 Lambda 上做错了什么
- 如果我在lambda中删除容纳lambda的对象,那会发生什么
- 这个 lambda 的参数是什么类型?
- 内联和constexpr在标头中无捕获lambda有什么区别