请考虑以下一些简单的代码:
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工作?
我看不到std :: function类具有输入类型为_Bind_helper的构造函数,因此std :: function xxx = std :: bind xxx如何工作?
它确实有这样的构造函数。是这个:
template< class F >
function( F f );
注意,仅当(推导的)模板参数为Callable时,此转换构造函数才参与重载解析-std::bind
的返回类型为Callable-。
类模板
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)>
使用带有可调用对象的构造函数。