std :: bind null函数指针

时间:2015-10-01 10:24:20

标签: c++ c++11 stdbind

#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}。这是一个错误或正确的行为,我在哪里可以阅读它?

1 个答案:

答案 0 :(得分:0)

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
  如果true存储可调用的函数目标,则返回值*this,否则为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包含一个可调用的对象。