bind null函数指针

std::bind null function pointer

本文关键字:指针 函数 null bind      更新时间:2023-10-16
#include <iostream>
#include <functional>
typedef int(*SumFptr)(int,int);
int main()
{
    SumFptr ptr = nullptr;
    std::function<int(int)> func = std::bind(ptr, std::placeholders::_1, 42);
    std::cout << (func ? "true" : "false") << std::endl;
    return 0;
}

输出为真。

我的期望是错误的,就像std::function{nullptr}。这是一个错误或正确的行为,我在哪里可以读到它?

std::function应该如何知道它被构造的对象包含一个空指针?

只要它有一个可调用对象,它就不能知道它是一个包含空指针的可调用对象(如果被调用会崩溃)。

当你构造std::function{nullptr}时,它知道它没有一个可调用的对象,并且表现得就像你调用了默认构造函数一样。std::function{ anything_else }导致它存储anything_else,除非它是一个空指针(不是一个包装空指针的对象),否则它将认为自己有一个目标对象。

http://en.cppreference.com/w/cpp/utility/functional/function/operator_bool

std::function::operator bool
返回值:如果*this存储可调用函数目标,则为true,否则为false

换句话说,你的程序几乎完全等同于:

#include <iostream>
#include <functional>
using SumFPtr = int(*)(int,int);
struct BoundFunction {    
    SumFptr fptr;
    int y;
    int operator()(int x) const { return fptr(x, y); }
};
BoundFunction bind(SumFPtr fptr, int y)
{
    return BoundFunction{fptr, y};
}
int main()
{
    std::function<int(int)> func = bind(nullptr, 42);
    std::cout << (func ? "true" : "false") << std::endl;
}

现在应该很明显,它当然打印"true",因为std::function包含一个可调用的对象。