我正在使用 C++11 库中的标准函数包装器,我看到它的布尔运算符有一些奇怪的行为。如果我创建一个std::function
对象,则布尔运算符返回 false。nullptr
如果我分配给对象并再次检查,这仍然是正确的。当我为其分配一个已转换为函数指针的 void 指针时,就会出现问题。考虑以下程序:
#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
(参见演示)。谁能解释为什么布尔运算符在包含一个空的、不可调用的函数指针时返回 true ?nullptr
并请提及一个解决方法来检查std::function
注意:我已经尝试检查目标是否为空(使用foo.target<void*>() == nullptr
)而不是使用布尔运算符,但似乎无论函数对象包含什么,目标始终为空(即使函数对象非常好被调用)。