C++中std::bind如何返回值以分配给std::function?

3

考虑下面的简单代码:

int f1(int a) {
  std::cout << a << std::endl;
}

int main (int agrc, char* argv[]) {
  std::function<int(int)> f = std::bind(&f1, std::placeholders::_1);
  f(123);

  return 0;
}

我已经阅读关于std :: function和std :: bind的一些文档,但仍然不理解它如何工作。编译器显示std :: bind的调用返回类型为_Bind_helper的对象,然而,我没有看到std :: function类具有带输入类型_Bind_helper的构建函数,那么std :: function xxx = std :: bind xxx 如何工作呢?


std::function有一个构造函数模板,接受任何可调用的函数对象类型。 - songyuanyao
只是一点小建议:在这里使用 std::bind 是不必要的。std::function<int(int)> f(f1); 可以完全达到同样的效果,而且没有 std::bind 带来的额外开销。 - Pete Becker
2个回答

3
我没有看到std::function类中有以_Bind_helper为输入类型的构造函数,那么std::function xxx = std::bind xxx是如何工作的呢?
它确实有这样的构造函数。就是这个:
template< class F >
function( F f );

请注意,只有在(推导出的)模板实参是可调用对象时,这个转换构造函数才参与重载决议——而std::bind的返回类型就是可调用对象。

1
根据ccpreference.com

类模板std::function是一个通用的多态函数包装器。 std::function的实例可以存储、复制和调用任何可调用目标——函数、lambda表达式、绑定表达式或其他函数对象,以及成员函数指针和数据成员指针。

存储的可调用对象称为std::function的目标。如果std::function不包含目标,则称为空。调用空的std :: function的目标会导致抛出std::bad_function_call异常。

std::function满足CopyConstructible和CopyAssignable的要求。

std::function基本上是可调用对象的包装器。它被称为类型擦除对象-它擦除操作的细节,以提供一个公共接口。

你的std::bind表达式

std::bind(&f1, std::placeholders::_1)

生成一个函数对象,调用函数f1并提供一个占位符参数,返回类型为int。因此,您可以将其分配给具有相同签名的函数对象:

std::function<int(int)>

它使用一个接受可调用对象的构造函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接