std :: function的奇怪行为

Ell*_*ink 4 c++ c++11 std-function

我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)

我期望作为输出,0 0 0但结果是0 0 1(见演示).任何人都可以解释为什么布尔运算符在包含空的,不可调用的函数指针时返回true?并请还提到的解决方法,检查nullptrstd::function

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

Igo*_*nik 5

对我来说看起来像个错误.首先,这是一个简单的例子,不播放任何带有强制转换的游戏:

#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;
}
Run Code Online (Sandbox Code Playgroud)

它仍然用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 要求: F 应为CopyConstructible.对于参数类型和返回类型,f应为Callable(20.8.11.2).复制构造函数和析构函数不应抛出异常.8 后置条件: 如果满足以下任何条件:ArgTypesRA
!*this

  • f是一个NULL函数指针.
  • fNULL指向成员的指针.
  • F 是函数类模板的一个实例,和 !f