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