[英]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::bind
和std::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.