假设我想通过引用函数来传递由 std::bind
创建的函数对象:
void myCallback(int i, int j)
{
std::cout << "toCall , i=" << i << " j=" << j;
}
void worker(std::function<void(int)> & callback)
{
callback(111);
}
int main(int argc, char** argv)
{
auto foo = std::bind(myCallback, std::placeholders::_1, 222);
worker(foo);
}
这不能编译
Severity Code Description Project File Line Suppression State Error C2664 'void worker(std::function &)': cannot convert argument 1 from 'std::_Binder &,int>' to 'std::function &' asn1test_1 D:.....\asn1test_1.....cpp 302
但是,按值传递是有效的:
void worker(std::function<void(int)> callback)
{
callback(111);
}
当我避免使用“auto
”并改为使用
std::function<void(int)> foo = std::bind(myCallback, std::placeholders::_1, 222);
它既可以通过引用传递,也可以通过值传递。
问题1:为什么会出现这种行为?
问题 2:将 std::bind
创建的对象传递给函数的“正确”方式或数据类型是什么?
最佳答案
std::bind
不返回std::function
,至少,不需要这样做。当你这样做时
auto foo = std::bind(myCallback, std::placeholders::_1, 222);
worker(foo);
foo
不是std::function
和worker
需要一个对 std::function
的非常量引用,所以编译器会出错。如果你切换worker
成为
void worker(const std::function<void(int)> & callback)
然后你将拥有一个 const 引用,它可以绑定(bind)到 foo
转换的临时对象。到 std::function
会产生。
我还想指出,由于我们有 lambda,尤其是通用的,std::bind
确实不需要。保留对 worker 的更改,您可以改为 foo
auto foo = [](auto var){ return myCallback(var, 222); };
关于c++ - 将 std::bind 创建的对象传递给函数的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59957211/