繁体   English   中英

为什么在 C++20 中使用 `std::bind_front` 而不是 lambda?

[英]Why use `std::bind_front` over lambdas in C++20?

正如措辞相似的问题( Why use bind over lambdas in c++14? )中提到的那样,答案是 - 没有理由(并且还提到了为什么使用 lambdas 会更好)。

我的问题是 - 如果在 C++14 中不再有使用绑定的理由,为什么标准委员会发现有必要在 C++20 中添加std::bind_front

它现在比 lambda 有什么新的优势吗?

bind_front绑定第一个 X 参数,但如果可调用对象调用更多参数,它们将被添加到末尾。 当您只绑定 function 的前几个参数时,这使得bind_front非常可读。

一个明显的例子是为绑定到特定实例的成员 function 创建一个可调用对象:

type *instance = ...;

//lambda
auto func = [instance](auto &&... args) -> decltype(auto) {return instance->function(std::forward<decltype(args)>(args)...);}

//bind
auto func = std::bind_front(&type::function, instance);

bind_front版本的噪音小得多。 它直截了当,有 3 个命名的东西: bind_front ,要调用的成员 function ,以及将在其上调用它的实例。 这就是我们的情况所需要的:一个标记,表示我们正在创建 function 的第一个参数的绑定,要绑定的 function 以及我们要绑定的参数。 没有多余的语法或其他细节。

相比之下,lambda 在这个位置有很多我们不关心的东西。 auto... args位, std::forward东西等。弄清楚它在做什么有点困难,而且阅读起来肯定要长得多。

请注意, bind_front根本不允许bind的占位符,因此它并不是真正的替代品。 它更像是bind最有用的 forms 的简写。

提出简化部分 function 应用程序的论文有一些很好的引人注目的用例。 我将在这里总结它们,因为否则我将不得不引用大部分论文,所以一定要 go 看看:

自动完美转发

使用 lambda 将涉及std::forward样板

传播可变性

如果通过值std::bindstd::bind_front存储 object 传播常量,但在捕获 lambda 的情况下,用户必须选择可变或常量版本,从而产生问题

保留返回类型

在用户端使用 lambda 将涉及-> decltype(auto)样板。

保值类

就像保留可变性一样,除了现在我们谈论的是左值/右值并且只有std::bind_front正确地做到这一点

支持一次性调用

传播可变性和保留值类别的结果

保留异常规范

这一点现在尤其重要,因为异常规范现在是类型系统的一部分


cppreference也有一些有用的注释:

此 function 旨在替换 std::bind。 与 std::bind 不同,它不支持任意参数重新排列,并且对嵌套的绑定表达式或 std::reference_wrappers 没有特殊处理。 另一方面,它关注调用包装器 object 的值类别,并传播底层调用运算符的异常规范。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM