可能重复:
由于lambda获得了广泛的支持,我对std::bind的使用已经下降到0。
在lambda函数上是否存在std::bind唯一适合的问题?
有一个令人信服的理由,使std::bind保持在标准,一旦lambdas添加了?
发布于 2011-11-11 01:30:40
您可以通过值捕获或引用捕获,问题是按值捕获实际上意味着“复制捕获”。这是一个只移动类型的节目停止。因此,您不能使用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();标准委员会简要地考虑允许在lambda捕获列表中任意的表达来解决这个问题(这看起来像[std::move(f)] { return f.bar(); }),但是我不认为有一个可靠的提议,而且C++11已经晚了。
对于我来说,这一点和对蓝宝石单形行为的限制是交易的破坏者。
发布于 2011-11-11 01:11:22
bind很适合创建绑定成员函数的引用:
Foo x;
auto f = std::bind(&Foo::bar, &x, 12, true);
register_callback(f);编辑:正如Luc所演示的,这种结构非常灵活,允许实例指针以惊人的形式出现(例如智能指针)。
如果可行的话,lambda可能更好,特别是因为它提供了更大的优化潜力,但是绑定表达式仍然有它们的位置。
(无论如何,对于存储可调用对象的类型,auto比std::function更可取。)
https://stackoverflow.com/questions/8088494
复制相似问题