首页 > 后端开发 > C++ > 在 C 14 中,什么时候你应该更喜欢 `std::bind` 而不是 Lambda?

在 C 14 中,什么时候你应该更喜欢 `std::bind` 而不是 Lambda?

Barbara Streisand
发布: 2024-12-23 09:09:34
原创
398 人浏览过

When Should You Prefer `std::bind` Over Lambdas in C  14?

Why Consider std::bind Over Lambdas in C 14?

C 14 introduced powerful lambda expressions, prompting some to question the continued relevance of std::bind. While lambdas offer concise syntax, std::bind maintains its utility in certain scenarios.

Unmovable Captured Variables:
In C 11, lambdas只能捕获左值变量,而bind允许移动变量。通过bind,可以写出如下代码:

auto f1 = std::bind(f, 42, _1, std::move(v));
登录后复制

捕获表达式:
lambda无法直接捕获表达式。相反,bind允许这样写:

auto f1 = std::bind(f, 42, _1, a + b);
登录后复制

函数对象重载参数:
在C 14中,lambdas可以通过类型推断解决这一问题,而bind在此场景中依然大放异彩。

无法传递参数:
理想情况下,需要使用完美转发的bind可以写成类似下面这样的代码:

auto f1 = [=](auto&amp;&amp; arg) { f(42, std::forward<decltype(arg)>(arg)); };
登录后复制

然而,bind将其阻止为以下形式:

auto f1 = std::bind(std::declval<decltype(f)>(), 42, _1);
auto f2 = std::bind(f, 42, std::declval<decltype(arg)>(), std::placeholders::_2);
登录后复制

bind的缺点:

  • 绑定名称可能会导致重载函数的歧义。
  • 相比lambda,使用bind时函数更有可能被内联化。

尽管如此,bind仍有其优点。它只产生一个函数对象类型,而lambda可能为每个函数生成一个独特的类型。最终,选择bind还是lambda取决于具体的使用场景和权衡利弊。

以上是在 C 14 中,什么时候你应该更喜欢 `std::bind` 而不是 Lambda?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板