gpt4 book ai didi

c++ - 我们是否应该在应用 std::bind 之前检查函数是否为空?

转载 作者:行者123 更新时间:2023-12-01 14:43:48 25 4
gpt4 key购买 nike

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();

上面的代码给出了输出 0 1,并且 binded_f()Unhandled exception at 0x00007FFE7B63A388 in: Microsoft C++ exception: std::bad_function_call at memory location 而崩溃0x00000096960FA660。发生在 MSVC 中

似乎调用空函数 f 没问题,而在应用 std::bind 后,它会崩溃。我们应该做什么?我们需要在绑定(bind)之前检查一个函数吗?

最佳答案

Seems calling the null function enter code here f is fine, while after std::bind applied, it will crash. What should we do?

不,两者都是

f(true);
binded_f();

将通过异常,您会看到第一个函数调用(即 f(true);)本身的异常。来自 cppreference.com std::function::operator()

Exceptions

std::bad_function_call if *this does not store a callable function target, i.e. !*this == true.

含义,f的调用显然是个异常(exception)。

也适用于 std::bind

Exceptions

Only throws if construction of std::decay<F>::type from std::forward<F>(f) throws, or any of the constructors for std::decay<Arg_i>::type from the corresponding std::forward<Arg_i>(arg_i) throws where Arg_i is the ith type and arg_i is the ith argument in Args... args.

f build 以来抛出/失败,绑定(bind)对象也会在调用时通过异常。


Do we need to check a function before binded?

是的,出于上述原因。

关于c++ - 我们是否应该在应用 std::bind 之前检查函数是否为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59434251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com