C++ 在应用std::bind之前,我们是否应该检查一个非空函数? std::函数f; std::function bind_f=std::bind(f,true); std::cout

C++ 在应用std::bind之前,我们是否应该检查一个非空函数? std::函数f; std::function bind_f=std::bind(f,true); std::cout,c++,c++11,lambda,std-function,stdbind,C++,C++11,Lambda,Std Function,Stdbind,std::bad_函数调用已经在f(true)发生 在调用f时以及在调用std::bind之前,需要检查f是否在这两种情况下都保留函数 std::bind需要一个对象,而std::function f本身是一个可调用的对象。但是调用f仅当它持有一个目标时才有效,因为调用f时,它将使用将调用转发到存储的目标 std::function binded_f持有一个目标,该目标将调用存储的f副本,并将true作为第一个参数,因此binded_f本身持有一个有效目标,但该目标,当它尝试用true调用f时,

std::bad_函数调用已经在
f(true)
发生

在调用
f
时以及在调用
std::bind
之前,需要检查
f
是否在这两种情况下都保留函数

std::bind
需要一个对象,而
std::function f
本身是一个可调用的对象。但是调用
f
仅当它持有一个目标时才有效,因为调用
f
时,它将使用将调用转发到存储的目标

std::function binded_f
持有一个目标,该目标将调用存储的
f
副本,并将
true
作为第一个参数,因此
binded_f
本身持有一个有效目标,但该目标,当它尝试用
true
调用
f
时,将失败,导致
std::bad_function_调用
,因为
f
没有有效的目标

如果将绑定替换为lambda,这一点会更加明显

std::function<void(bool)> f;
std::function<void()> binded_f = std::bind(f, true);
std::cout << (f != nullptr) << " " << (binded_f != nullptr) << "\n";
f(true);
binded_f();
std::函数f;
std::绑定函数f=[f](){
返回f(真);
};
标准::cout
似乎调用
null
函数在此处输入代码
f
可以,而在
std::bind
如果应用,它将崩溃。我们该怎么办

不,两者都有

std::function<void(bool)> f;
std::function<void()> binded_f = [f]() {
   return f(true);
};

std::cout << (f != nullptr) << " " << (binded_f != nullptr) << "\n";
f(true);
binded_f();
将通过exception,您将看到第一个函数调用本身的异常(即
f(true);
)。 来自cppreference.com

例外情况

std::坏的函数调用
如果
*此
未存储可调用 功能目标,即
*此==true

也就是说,调用
f
显然是个例外

也为了

例外情况

仅当从
std::forward(f)
抛出
,或
std::decay::type
来自相应的
std::forward(arg_i)
抛出,其中
arg_
i是第i个类型和
arg_i
Args中的第i个参数。。。args

由于
f
的构造抛出/失败,绑定的对象也将在调用时通过异常


我们需要在绑定之前检查函数吗

是的,出于上述原因

f(true);
binded_f();