我在使用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)由于签名不匹配导致编译失败。
答案 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与上面的错误列表一致。