std :: function构造函数和nullptr

Fro*_*art 18 c++ c++11

为什么以下代码打印"0"作为输出?

#include <functional>
#include <iostream>

int main()
{
    typedef void (*fp_t)();

    fp_t fp = nullptr;

    std::function<void()> f = fp;
    std::cout << (f == nullptr) << '\n';
}
Run Code Online (Sandbox Code Playgroud)

我用gcc 4.7.2和MSVC-11.0测试了它.

我认为它应该打印"1",因为标准的以下引用:

ISO/IEC 14882:2011

20.8.11.2.1 function construct/copy/destroy [func.wrap.func.con]

template<class F> function(F f);
template<class F, class A> function(allocator_arg_t, const A& a, F f);

...

8 后置条件: !*this如果满足以下任何条件: - fNULL 函数指针.- fNULL指向成员的指针.- F是函数类模板的实例,和!f

And*_*owl 15

我认为这是一个错误.根据C++ 11标准的第20.8.11.2.6/1段:

template <class R, class... ArgTypes>
bool operator==(const function<R(ArgTypes...)>& f, nullptr_t) noexcept;

template <class R, class... ArgTypes>
bool operator==(nullptr_t, const function<R(ArgTypes...)>& f) noexcept;
Run Code Online (Sandbox Code Playgroud)

1 返回:!f.

因此,(f == nullptr)应该评估true当且仅当!f评估为true.然后,第20.8.11.2.1/8段规定:

template<class F> function(F f);
template <class F, class A> function(allocator_arg_t, const A& a, F f);
Run Code Online (Sandbox Code Playgroud)

[...]

8 后置条件:!*this如果满足以下任何条件:

- f是一个NULL函数指针.

[...]

由于fp是一个空函数指针,上面的段落应该保证在初始化ffrom之后fp,表达式!f求值为true.这反过来意味着,nullptr应该返回的比较true(通过§20.8.11.2.6/ 1).

这反过来意味着,这是一个错误.