Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::bind null函数指针 #包括 #包括 类型定义int(*SumFptr)(int,int); int main() { SumFptr ptr=空ptr; std::function func=std::bind(ptr,std::占位符::_1,42); std::cout_C++_C++11_Stdbind - Fatal编程技术网

C++ std::bind null函数指针 #包括 #包括 类型定义int(*SumFptr)(int,int); int main() { SumFptr ptr=空ptr; std::function func=std::bind(ptr,std::占位符::_1,42); std::cout

C++ std::bind null函数指针 #包括 #包括 类型定义int(*SumFptr)(int,int); int main() { SumFptr ptr=空ptr; std::function func=std::bind(ptr,std::占位符::_1,42); std::cout,c++,c++11,stdbind,C++,C++11,Stdbind,如何让std::function知道构造它的对象包含空指针 就它有一个可调用的对象而言,它无法知道它是一个包含空指针的可调用对象(如果被调用会崩溃) 当您构造std::function{nullptr}时,它知道它没有可调用的对象,其行为与您调用默认构造函数的行为完全相同。std::function{anything}使它存储anything除非它是空指针(不是封装空指针的对象!)会考虑自己有一个目标对象。 std::function::operator bool 返回值:true如果*此存储

如何让
std::function
知道构造它的对象包含空指针

就它有一个可调用的对象而言,它无法知道它是一个包含空指针的可调用对象(如果被调用会崩溃)

当您构造
std::function{nullptr}
时,它知道它没有可调用的对象,其行为与您调用默认构造函数的行为完全相同。
std::function{anything}
使它存储
anything
除非它是空指针(不是封装空指针的对象!)会考虑自己有一个目标对象。

std::function::operator bool

返回值:
true
如果
*此
存储可调用函数目标,否则为
false

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

#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;
}
#包括
#包括
使用SumFPtr=int(*)(int,int);
结构边界函数{
SumFptr fptr;
int-y;
int运算符()(int x)常量{return fptr(x,y);}
};
绑定函数绑定(SumFPtr fptr,int y)
{
返回边界函数{fptr,y};
}
int main()
{
std::function func=bind(nullptr,42);

是的,但是检查bind的参数不是很容易吗?比如:bind(func,…{if(!func)save_nullptr_callable()}这在理论上是可能的,但是
std::function
必须知道如何检查它。您看到了标准中指定的任何内容吗?为什么
bind
是一个特例,当它对我的
BoundFunction
或捕获空函数指针的lambda不起作用时?此外,您还可以e一些
func
是有效的可调用对象,但
!func
为true,因此需要更加小心才能正确识别空指针。
#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;
}