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&& 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的缺点:
尽管如此,bind仍有其优点。它只产生一个函数对象类型,而lambda可能为每个函数生成一个独特的类型。最终,选择bind还是lambda取决于具体的使用场景和权衡利弊。
以上是在 C 14 中,什么时候你应该更喜欢 `std::bind` 而不是 Lambda?的详细内容。更多信息请关注PHP中文网其他相关文章!