VS2012 std::function operator bool returns true 意外

VS2012 std::function operator bool returns true unexpectedly

我在 VS2012 中遇到了一个奇怪的行为 std::function,我在网上找不到任何相关信息。

给定以下示例程序:

#include <functional>
#include <iostream>

typedef std::function< int()> fntype;

void foo(const fntype& fn)
{
    try
    {
        if(fn)
            fn();
        else
            std::cout << "fn is empty" << std::endl;
    }
    catch(const std::bad_function_call&)
    {
        std::cout << "fn threw anyways" << std::endl;
    }
}


int main(int argc, char **argv)
{
    // OK
    std::function<int()> nothing;
    foo(nothing);

    // Fails
    std::function<const int()> nothing2;
    foo(nothing2);
    
    return 0;
}

第二次调用 foo() 编译(即使 return 类型的常量与 fntype 不匹配。 然而,if(fn) 仍然计算为真。

输出为:

fn is empty

fn threw anyways

注意:在调试器中,两种情况下fn都显示为empty

GCC 无法重现此行为 (Coliru)。在这里,产生了预期的输出:

输出为:

fn is empty

fn is empty

这是标准库的 VS2012 实现中的问题吗?

有没有办法解决这个问题 a) 在情况 2 中让 fntype::operator bool() 评估为 false 或 b) 由于签名不匹配导致编译失败。

看起来这是 2012 年的错误,2013 年似乎没有发生 see it live this bugs list: 44 C++11 bugs fixed in Visual Studio 2013 还提到这是在 2013 年修复的,它说:

In some cases, the conversion could produce an incorrect result in VS2012 due to the function object not being empty when it should be. For example:

// JetPlane derives from Plane
function<bool(JetPlane*)> plane_ready_func = function<bool(Plane*)>();
if (plane_ready_func)   // should yield false but doesn't
{
    plane_ready_func(nullptr);   // gets called and throws bad_function_call
}

default constructor for std::function 应该创建一个空函数

我找到了至少一个 one bug report 与上面的错误列表一致。