Попаднах на странно поведение във 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() се компилира (въпреки че const на връщания тип не съответства на fntype. Въпреки това, if(fn) се оценява на true въпреки това.
Резултатът е:
fn е празен
fn все пак хвърли
Забележка: В програмата за отстраняване на грешки fn се показва като празен и в двата случая
Това поведение не може да бъде възпроизведено с GCC (Coliru). Тук се получава очакваният резултат:
Резултатът е:
fn е празен
fn е празен
Това проблем ли е в изпълнението на VS2012 на стандартната библиотека?
Има ли начин за заобикаляне на проблема чрез: a) Оценката на fntype::operator bool() на false в случай 2 или b) Неуспешна компилация поради несъответствие на подписа.