gpt4 book ai didi

c++ - std::function 的奇怪行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:19:26 25 4
gpt4 key购买 nike

我正在使用 C++11 库中的标准函数包装器,我看到它的 bool 运算符有一些奇怪的行为。如果我创建一个 std::function object 的 bool 运算符返回 false。如果我分配 nullptr,这仍然是正确的到对象并再次检查。当我为它分配一个已转换为函数指针的空指针时,问题就出现了。考虑以下程序:

#include <functional>
#include <iostream>

void* Test() {
return nullptr;
}

int main(int argc, char* argv[]) {
std::function<void()> foo;
std::cout << !!foo << std::endl;

foo = nullptr;
std::cout << !!foo << std::endl;

foo = reinterpret_cast<void(*)()>(Test());
std::cout << !!foo << std::endl;

return 0;
}

我期望的输出是 0 0 0但结果是 0 0 1 (参见 demo)。谁能解释为什么 bool 运算符在包含空的、不可调用的函数指针时返回 true?并且还请提及检查 nullptr 的解决方法在 std::function

注意:我已经尝试检查目标是否为空(使用 foo.target<void*>() == nullptr )而不是使用 bool 运算符,但似乎无论函数对象包含什么,目标始终为空(即使当函数对象在被调用时完全没问题)。

最佳答案

在我看来像是一个错误。首先,这是一个 simplified example不玩任何带 Actor 的游戏:

#include <functional>
#include <iostream>

typedef void (*VF)();

VF Test() {
return nullptr;
}

int main(int argc, char* argv[]) {
std::function<void()> foo(Test());
std::cout << !!foo << std::endl;
return 0;
}

它仍然使用 GCC 打印 1。它不应该:

20.8.11.2.1
template<class F> function(F f);
template <class F, class A> function(allocator_arg_t, const A& a, F f);
7 Requires: F shall be CopyConstructible. f shall be Callable (20.8.11.2) for argument types ArgTypes and return type R. The copy constructor and destructor of A shall not throw exceptions.
8 Postconditions: !*this if any of the following hold:

  • f is a NULL function pointer.
  • f is a NULL pointer to member.
  • F is an instance of the function class template, and !f

关于c++ - std::function 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19578237/

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