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