c++ - 将 std::bind 创建的对象传递给函数的正确方法是什么?

标签 c++ pass-by-reference functor auto stdbind

假设我想通过引用函数来传递由 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);
}

这不能编译

compiler error

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::functionworker需要一个对 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/

相关文章:

python - 不能在 visual studio 中包含 Python.h

java - Java 是 "pass-by-reference"还是 "pass-by-value"?

php - 函数调用按引用传递?

c - 如何将汇编程序值返回给 C Int 指针?

c++ - 将成员函数作为回调传递给其他类的构造函数

c++ - 从 trait 获取 const 或非常量引用类型

c++ - 如何创建文件的 md5 或 sha1 校验和而不将其内容加载到内存?

c++ - 在 visual studio 中使用 QChart

c++ - MFC DDX_Radio 在调用 DoDataExchange 时导致调试断言失败(dlgdata.cpp 第 286 行)

haskell - 为什么应该在函数式编程中使用应用仿函数?