为什么 bind() 应该被弃用?

Why should bind() be deprecated?

阅读 C++17 关于删除标准中一些已弃用的、旧的和未使用的部分的提案 (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4190.htm),我发现 D.9 部分有点奇怪:

D.9 "Binders" [depr.lib.binders]

This defines bind1st()/bind2nd(), which were strictly superseded by bind(). (In the future, I'll argue that bind() itself has been superseded by lambdas and especially generic lambdas, so bind() should be deprecated, but that isn't part of this proposal.)

我没有得到关于 bind() 本身被 lambdas 取代的评论。

如果我有 class:

class A
{
  public:
    void f(int a){}
    void f(int a, int b){}
}

我想将指向 A::f 的函数指针传递给某个函数 someFunction,以便该函数可以在从 A 实例化的对象上调用它,我声明 someFunction:

void someFunction(const std::function<void(int, int)>&);

并称它为:

A a;
someFunction(std::bind(static_cast<void (A::*)(int, int)> (&A::f),
                       std::ref(a), 
                       std::placeholders::_1,
                       std::placeholders::_2));

如何使用 lambda 实现相同的目的? bind() 真的没有什么是 lambda 做不到的吗?

你是怎么做到的?与 std::refplaceholders_.

的绑定示例相比,非常直接且不那么深奥(我的意见
#include <iostream>
#include <functional>

class A
{
public:
   void f(int a) {}
   void f(int a, int b) { std::cout << a + b << '\n';}
};

void someFunction(const std::function<void(int, int)>& f)
{
   f(1, 2);
}

int main()
{
   A a;
   someFunction([&] (int x, int y) { a.f(x, y); });
   return 0;
}