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

def*_*ode 14 c++ lambda bind c++11

可能重复:
绑定与Lambda?

std::bind由于lambdas获得了广泛的支持,我的使用已降至0.

是否有任何特别std::bind适合lambda函数的问题?

有没有令人信服的理由保持std::bind标准一旦增加了lambda?

Luc*_*ton 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();
Run Code Online (Sandbox Code Playgroud)

IIRC标准委员会简要地考虑过允许在lambda捕获列表中任意表达来解决这个问题(可能看起来像这样[std::move(f)] { return f.bar(); }),但我认为没有一个可靠的提议并且C++ 11已经迟到了.

那和lambdas对单形行为的限制对我来说是违规行为.

  • 在C++ 14中添加了lambda移动捕获,所以我认为这一点现在已经不存在了;-) (6认同)