这不是一个问题,而是一个沉思......我写了一个程序来测试'std :: bind'如何将参数传递给被绑定的函数。在这种情况下,C ++编译器似乎执行静态类型检查:
#include <iostream>
#include <functional>
void take_int(const int *a)
{
if (a)
{
std::cout << "a is " << *a << std::endl;
}
else
{
std::cout << "null" << std::endl;
}
}
int main()
{
int *a = new(int);
*a = 4;
take_int(NULL); //prints 'null'
auto fn = std::bind(take_int, NULL); //fails to compile
fn();
return 0;
}
似乎不一致的是能够直接用NULL调用该函数,但是在编译时通过std :: bind这样做会失败。
我猜std :: bind正在使用更现代的C ++功能选择强制执行此操作?
这是因为您使用的是NULL
,不推荐使用。相反,你应该使用nullptr
。
如果你在剪辑中使用nullptr
,代码将按预期编译。
你需要记住这一点
NULL
可以是值为零的整数文字,或者是std :: nullptr_t类型的prvalue
在您的情况下,它是整数文字。当您使用该值调用函数时,它将转换为指针 - 这就是调用函数直接起作用的原因。
你的编译器将NULL
定义为0
,它作为文字可以隐式转换为int*
。这就是为什么你的第一次通话是成功的。但std::bind()
将为<void (&)(const int *),int>
生成一个无法调用的对象,因为int
类型的变量不能隐式转换为int*
。