bind null函数指针
std::bind null function pointer
#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
,除非它是一个空指针(不是一个包装空指针的对象),否则它将认为自己有一个目标对象。
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
包含一个可调用的对象。
相关文章:
- 如何正确编写指针函数声明?
- C++常规指针函数或模板
- 如何重新定义 C++ 指针函数?
- C++ 指向其他类函数的指针函数
- 指针到指针函数参数
- 将指向成员的指针函数传递到模板中
- C++ 在 none 常量指针函数中返回一个常量指针
- 如何使用指针函数编写/读取数组
- 是C 中的函数指针函数对象
- 如何从另一个类调用指向成员的指针函数
- 如何声明采用指向成员的指针函数的函数
- 如何构造一个以可变参数指针函数作为成员的类?
- c 通过值或指针函数语法
- 将typedef方法作为指针函数传递
- 从 Main 中的双指针函数打印出指针数组
- strcpy 对指针函数的引用
- 这是否仍然声明一种指针函数的别名?
- 将指向成员的指针函数与 std::shared_ptr 结合使用
- 'Incomplete type' 为标准::函数声明指向成员的指针函数模板参数时出错
- 从注入进程的 DLL 调用函数并更改指针函数的地址