VS2012 std :: function operator bool意外返回true

时间:2015-03-09 17:50:44

标签: c++ c++11 visual-studio-2012 signature std-function

我在使用std :: function的VS2012中遇到了一个奇怪的行为,我在网上找不到任何东西。

给出以下示例程序:

#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()进行编译(即使返回类型的const与 fntype 不匹配。 但是, if(fn)仍然评估为真。

输出结果为:

  

fn为空

     

fn扔了反正

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

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

输出结果为:

  

fn为空

     

fn为空

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

有没有办法解决这个问题 a)在案例2或中,将fntype :: operator bool()计算为false b)由于签名不匹配导致编译失败。

1 个答案:

答案 0 :(得分:3)

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

  

在某些情况下,转换可能会产生错误的结果   VS2012由于功能对象应该是空的。   例如:

// 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与上面的错误列表一致。