C++ 在应用std::bind之前,我们是否应该检查一个非空函数? std::函数f; std::function bind_f=std::bind(f,true); std::cout
std::bad_函数调用已经在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时,
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();