可能重复:
Bind Vs Lambda?
我对std::bind
的使用已降至0,因为lambdas已获得广泛的支持。
是否存在std::bind
特别适合lambda函数的问题?
有没有令人信服的理由在添加了lambda之后将std::bind
保留在标准中?
答案 0 :(得分:21)
您可以按值或按引用捕获,问题是按值捕获实际上意味着“通过复制捕获”。这是一种仅限移动式的止动器。所以你不能使用lambda来执行以下操作:
struct foo { void bar() {} };
std::unique_ptr<foo> f { new foo };
auto bound = std::bind(&foo::bar, std::move(f));
static_assert( std::is_move_constructible<decltype(bound)>::value, "" );
bound();
IIRC标准委员会简要考虑允许在lambda捕获列表中任意表达来解决这个问题(看起来像[std::move(f)] { return f.bar(); }
),但我认为没有一个可靠的提议,C ++ 11已经是迟到了。
对于我来说,对lambdas的单态行为的限制对我来说是违规行为。
答案 1 :(得分:4)
bind
非常适合创建对绑定成员函数的引用:
Foo x;
auto f = std::bind(&Foo::bar, &x, 12, true);
register_callback(f);
编辑:正如Luc Danton演示的那样,这种结构非常灵活,允许实例指针出现各种各样的伪装(例如智能指针)。[/]
如果可行的话,lambda可能更可取,特别是因为它提供了更大的优化潜力,但绑定表达式仍然占有一席之地。
(无论如何,对于存储可调用对象的类型,auto
优于std::function
。)