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

标签 c++ templates lambda c++14 perfect-forwarding

我看到的代码如下所示:

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 的发展方向。

为什么?因为函数对象的完美转发确实很难做到完美,并且在大多数情况下你无法以完美通用的方式多次调用该函数。仅当我想要包装函数、想要完全避免复制并且我期望函数对象具有临时对象的 ref 资格时,我才会完美转发该函数。

关于c++ - && 对 lambda 表达式有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59617708/

相关文章:

java - 使用父类(super class)类型过滤模板可以删除对父类(super class)中静态变量的修改

c++ - 初始化嵌套模板类

python - AWS Lambda Python S3读取文件错误

c# - 使用 Lambda 表达式创建自定义列表

lambda - 为什么`id id`在OCaml中不是值?

c++ - 实现无操作 std::ostream

C++ 独立功能

c++ - 如何制作多客户端 UDP 服务器

c++ - 平等的定义

c++ - 如何使用可变参数包为嵌套模板类起别名