c++ - && 对 lambda 表达式有什么好处?
问题描述
我看到的代码如下所示:
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)
,则需要 astd::move
并且 lambda 在调用后将不可用。
如果签名是MyFunc(Function const& f)
,它将不起作用,因为 lambda 是可变的。
如果是这样,MyFunc(Function& f)
那么临时将不起作用。
你基本上只剩下MyFunc(Function&& f)
.
然而,真正的问题是“我需要支持所有这些案例吗?”
我会说:大多数时候没有。大多数时候,按值接收 lambda 是最简单的,并且几乎支持所有情况。这就是 STL 的方式。
为什么?因为函数对象的完美转发真的很难做到完美,而且在大多数情况下,你不能以完全通用的方式多次调用函数。只有当我想包装一个函数、想完全避免复制并且我希望函数对象是 ref 合格的临时对象时,我才会完善它。
推荐阅读
- reactjs - 当幻灯片到达最后一个数组/数据时如何添加组件
- database - 如何在laravel中的三个表之间创建多对多
- azure - 尝试以编程方式在 Azure 上创建应用程序注册时出现“发送请求时出错”
- python - 如何拆分当前日期时间并仅检索日期、小时和分钟?
- html - offsetTop 相对于 body 和 div 的行为方式不同
- browser - 无法从具有 ipv6 的计算机访问某些网站?
- java - 扩展的 WebDriver 和 WebElement 不起作用
- php - 修复 10 月 CMS 安装在“构建配置文件”时失败
- java - 如何在 intellij 中找到打开的 hql 会话
- reactjs - 如何将重复的 API 调用重构为单个 API 调用?