为什么std :: bind静态地将类型检查参数传递给函数?

时间:2018-08-31 14:19:19

标签: c++ stdbind

这不只是一个问题,而是更多的沉思……我编写了一个程序来测试'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 ++功能来选择强制执行此功能?

2 个答案:

答案 0 :(得分:5)

这是因为您不赞成使用NULL。相反,您应该使用nullptr

如果在摘要中使用nullptr,代码将按预期编译。

您需要记住

  

NULL可以是值为零的整数文字,也可以是类型为的prvalue   std :: nullptr_t

在您的情况下,它是整数文字。当您使用该值调用函数时,它将转换为指针-这就是为什么直接调用函数的原因。

答案 1 :(得分:3)

您的编译器将NULL定义为0,它可以作为文字直接隐式转换为int*。这就是为什么您的第一个电话成功的原因。 但是std::bind()会为<void (&)(const int *),int>生成一个对象,该对象不能被调用,因为类型int的变量不能隐式转换为int*