与lambdas相比,std :: bind仍然有用吗?

时间:2011-11-11 01:04:31

标签: c++ lambda bind c++11

  

可能重复:
  Bind Vs Lambda?

我对std::bind的使用已降至0,因为lambdas已获得广泛的支持。

是否存在std::bind特别适合lambda函数的问题?

有没有令人信服的理由在添加了lambda之后将std::bind保留在标准中?

2 个答案:

答案 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。)

相关问题