c ++ std :: bind如何将返回值分配给std :: function?

问题描述 投票:3回答:2

请考虑以下一些简单的代码:

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的方式如何::绑定xxx工作?

c++ function c++11 stl bind
2个回答
3
投票

我看不到std :: function类具有输入类型为_Bind_helper的构造函数,因此std :: function xxx = std :: bind xxx如何工作?

它确实有这样的构造函数。是这个:

template< class F >
function( F f );

注意,仅当(推导的)模板参数为Callable时,此转换构造函数才参与重载解析-std::bind的返回类型为Callable-。


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)>

使用带有可调用对象的构造函数。

© www.soinside.com 2019 - 2024. All rights reserved.