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

Luk*_*ell 2 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;
}
Run Code Online (Sandbox Code Playgroud)

似乎不一致的是能够直接用NULL调用该函数,但是在编译时它通过std :: bind失败了.

我猜std :: bind正在使用更现代的C++功能选择强制执行此操作?

Ser*_*eyA 5

这是因为您正在使用NULL,不推荐使用.相反,你应该使用nullptr.

如果您nullptr在剪切中使用,代码将按预期编译.

你需要记住这一点

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

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

  • _那不是我用std :: bind做的事情吗?_不 - 看看[`std :: bind`]的原型(https://en.cppreference.com/w/cpp/utility/functional/bind )."Args ..."的类型被推断为你传递的内容 - 它无法知道你是否希望它将一个隐式转换应用为`take_int(const int*)`. (2认同)