我正在使用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
(参见演示)。有人能解释一下为什么布尔运算符在包含null、不可调用的函数指针时返回true吗?请同时提供一种检查std::function
中的nullptr
的解决方法。注意:我已经尝试过检查目标是否为空(使用
foo.target<void*>() == nullptr
),而不是使用布尔运算符,但似乎无论函数对象包含什么内容,目标始终为空(即使函数对象可以完全正常地被调用)。
0 0 0
- dyp