【发布时间】:2013-10-24 22:58:56
【问题描述】:
我正在使用 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(参见demo)。任何人都可以解释为什么布尔运算符在包含一个空的、不可调用的函数指针时返回 true 吗?还请提及在std::function 中检查nullptr 的解决方法
注意:我已经尝试过检查目标是否为空(使用foo.target<void*>() == nullptr)而不是使用布尔运算符,但似乎无论函数对象包含什么,目标始终为空(即使调用函数对象非常好)。
【问题讨论】:
-
clang++3.4 output:
0 0 0 -
这对我来说看起来很熟悉,实际上,它可能与:stackoverflow.com/q/16823501/420683(除了 UB 问题,请参阅 Daniel Frey 的回答)
标签: c++ c++11 std-function